ソースを参照

Merge pull request #2044 from wychen/Win32ANSI

Fix Win32 error messages on Unicode build
Feng Xiao 9 年 前
コミット
78aee1b15f

+ 1 - 1
appveyor.bat

@@ -10,7 +10,7 @@ goto :error
 echo Building C++
 mkdir build_msvc
 cd build_msvc
-cmake -G "%generator%" -Dprotobuf_BUILD_SHARED_LIBS=%BUILD_DLL% ../cmake
+cmake -G "%generator%" -Dprotobuf_BUILD_SHARED_LIBS=%BUILD_DLL% -Dprotobuf_UNICODE=%UNICODE% ../cmake
 msbuild protobuf.sln /p:Platform=%vcplatform% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" || goto error
 cd %configuration%
 tests.exe || goto error

+ 1 - 0
appveyor.yml

@@ -11,6 +11,7 @@ environment:
   matrix:
     - language: cpp
       BUILD_DLL: ON
+      UNICODE: ON
 
     - language: csharp
 

+ 4 - 0
cmake/CMakeLists.txt

@@ -159,6 +159,10 @@ else (MSVC)
   set(LIB_PREFIX)
 endif (MSVC)
 
+if (protobuf_UNICODE)
+  add_definitions(-DUNICODE -D_UNICODE)
+endif (protobuf_UNICODE)
+
 include(libprotobuf-lite.cmake)
 include(libprotobuf.cmake)
 include(libprotoc.cmake)

+ 5 - 0
src/google/protobuf/compiler/command_line_interface_unittest.cc

@@ -719,6 +719,11 @@ TEST_F(CommandLineInterfaceTest, TrailingBackslash) {
   ExpectGenerated("test_generator", "", "foo.proto", "Foo");
 }
 
+TEST_F(CommandLineInterfaceTest, Win32ErrorMessage) {
+  EXPECT_EQ("The system cannot find the file specified.\r\n",
+    Subprocess::Win32ErrorMessage(ERROR_FILE_NOT_FOUND));
+}
+
 #endif  // defined(_WIN32) || defined(__CYGWIN__)
 
 TEST_F(CommandLineInterfaceTest, PathLookup) {

+ 6 - 6
src/google/protobuf/compiler/subprocess.cc

@@ -261,12 +261,12 @@ string Subprocess::Win32ErrorMessage(DWORD error_code) {
   char* message;
 
   // WTF?
-  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
-                FORMAT_MESSAGE_FROM_SYSTEM |
-                FORMAT_MESSAGE_IGNORE_INSERTS,
-                NULL, error_code, 0,
-                (LPTSTR)&message,  // NOT A BUG!
-                0, NULL);
+  FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER |
+                 FORMAT_MESSAGE_FROM_SYSTEM |
+                 FORMAT_MESSAGE_IGNORE_INSERTS,
+                 NULL, error_code, 0,
+                 (LPSTR)&message,  // NOT A BUG!
+                 0, NULL);
 
   string result = message;
   LocalFree(message);

+ 8 - 8
src/google/protobuf/testing/file.cc

@@ -141,12 +141,12 @@ void File::DeleteRecursively(const string& name,
 
 #ifdef _MSC_VER
   // This interface is so weird.
-  WIN32_FIND_DATA find_data;
-  HANDLE find_handle = FindFirstFile((name + "/*").c_str(), &find_data);
+  WIN32_FIND_DATAA find_data;
+  HANDLE find_handle = FindFirstFileA((name + "/*").c_str(), &find_data);
   if (find_handle == INVALID_HANDLE_VALUE) {
     // Just delete it, whatever it is.
-    DeleteFile(name.c_str());
-    RemoveDirectory(name.c_str());
+    DeleteFileA(name.c_str());
+    RemoveDirectoryA(name.c_str());
     return;
   }
 
@@ -156,15 +156,15 @@ void File::DeleteRecursively(const string& name,
       string path = name + "/" + entry_name;
       if (find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
         DeleteRecursively(path, NULL, NULL);
-        RemoveDirectory(path.c_str());
+        RemoveDirectoryA(path.c_str());
       } else {
-        DeleteFile(path.c_str());
+        DeleteFileA(path.c_str());
       }
     }
-  } while(FindNextFile(find_handle, &find_data));
+  } while(FindNextFileA(find_handle, &find_data));
   FindClose(find_handle);
 
-  RemoveDirectory(name.c_str());
+  RemoveDirectoryA(name.c_str());
 #else
   // Use opendir()!  Yay!
   // lstat = Don't follow symbolic links.