Commit 0b429b609c4a5fec8568dc9716e920533e13ab74

Alexei Podtelezhnikov 2021-09-17T08:31:27

[builds/windows] Try both wide and narrow `CreateFile` Windows handles wchar_t* UTF-16 and char* ANSI (presently UTF-8) filenames using alternative -A and -W API. We'll try them both when opening a file. This means that you should not worry about about conversions. Fixes #1098 and !76. * builds/windows/ftsystem.c (FT_Stream_Open): Call alternative `CreateFile` in the case of failure.

diff --git a/builds/windows/ftsystem.c b/builds/windows/ftsystem.c
index 9a6f0c4..69ef494 100644
--- a/builds/windows/ftsystem.c
+++ b/builds/windows/ftsystem.c
@@ -215,9 +215,21 @@
                        NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 );
     if ( file == INVALID_HANDLE_VALUE )
     {
-      FT_ERROR(( "FT_Stream_Open:" ));
-      FT_ERROR(( " could not open `%s'\n", filepathname ));
-      return FT_THROW( Cannot_Open_Resource );
+      /* fall back on the alernative interface */
+#ifdef UNICODE
+      file = CreateFileA( (LPCSTR)filepathname, GENERIC_READ, FILE_SHARE_READ,
+                          NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 );
+#else
+      file = CreateFileW( (LPCWSTR)filepathname, GENERIC_READ, FILE_SHARE_READ,
+                          NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 );
+#endif
+
+      if ( file == INVALID_HANDLE_VALUE )
+      {
+        FT_ERROR(( "FT_Stream_Open:" ));
+        FT_ERROR(( " could not open `%s'\n", filepathname ));
+        return FT_THROW( Cannot_Open_Resource );
+      }
     }
 
 #if defined _WIN32_WCE || defined _WIN32_WINDOWS || \