[PATCH 3/5] programs/regsvr32: Convert source to Unicode for internationalial output

Hugh McMaster hugh.mcmaster at outlook.com
Thu May 28 06:14:18 CDT 2015


Fixes https://bugs.winehq.org/show_bug.cgi?id=38638
---
 programs/regsvr32/Makefile.in |  2 +-
 programs/regsvr32/regsvr32.c  | 47 ++++++++++++++++++-------------------------
 programs/regsvr32/regsvr32.rc |  2 +-
 3 files changed, 22 insertions(+), 29 deletions(-)

diff --git a/programs/regsvr32/Makefile.in b/programs/regsvr32/Makefile.in
index db567ea..b99db28 100644
--- a/programs/regsvr32/Makefile.in
+++ b/programs/regsvr32/Makefile.in
@@ -1,5 +1,5 @@
 MODULE    = regsvr32.exe
-APPMODE   = -mconsole
+APPMODE   = -mconsole -municode
 IMPORTS   = ole32 user32
 
 C_SRCS = \
diff --git a/programs/regsvr32/regsvr32.c b/programs/regsvr32/regsvr32.c
index 181019b..9cb360c 100644
--- a/programs/regsvr32/regsvr32.c
+++ b/programs/regsvr32/regsvr32.c
@@ -55,6 +55,7 @@
 #include <windows.h>
 #include <ole2.h>
 #include "regsvr32.h"
+#include "wine/unicode.h"
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(regsvr32);
@@ -67,14 +68,14 @@ static BOOL Silent = FALSE;
 
 static void __cdecl output_write(UINT id, ...)
 {
-    char fmt[1024];
+    WCHAR fmt[1024];
     __ms_va_list va_args;
-    char *str;
+    WCHAR *str;
     DWORD len, nOut, ret;
 
     if (Silent) return;
 
-    if (!LoadStringA(GetModuleHandleA(NULL), id, fmt, sizeof(fmt)/sizeof(fmt[0])))
+    if (!LoadStringW(GetModuleHandleW(NULL), id, fmt, sizeof(fmt)/sizeof(fmt[0])))
     {
         WINE_FIXME("LoadString failed with %d\n", GetLastError());
         return;
@@ -82,19 +83,19 @@ static void __cdecl output_write(UINT id, ...)
 
     __ms_va_start(va_args, id);
     SetLastError(NO_ERROR);
-    len = FormatMessageA(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ALLOCATE_BUFFER,
-                         fmt, 0, 0, (LPSTR)&str, 0, &va_args);
+    len = FormatMessageW(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ALLOCATE_BUFFER,
+                         fmt, 0, 0, (LPWSTR)&str, 0, &va_args);
     __ms_va_end(va_args);
     if (len == 0 && GetLastError() != NO_ERROR)
     {
-        WINE_FIXME("Could not format string: le=%u, fmt=%s\n", GetLastError(), wine_dbgstr_a(fmt));
+        WINE_FIXME("Could not format string: le=%u, fmt=%s\n", GetLastError(), wine_dbgstr_w(fmt));
         return;
     }
 
-    ret = WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), str, len, &nOut, NULL);
+    ret = WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), str, len, &nOut, NULL);
 
     if (!ret)
-        WINE_WARN("regsvr32: WriteConsoleA() failed.\n");
+        WINE_WARN("regsvr32: WriteConsoleW() failed.\n");
 
     LocalFree(str);
 }
@@ -107,11 +108,11 @@ static void __cdecl output_write(UINT id, ...)
  * procName - name of the procedure to load from dll
  * pDllHandle - output variable receives handle of the loaded dll.
  */
-static VOID *LoadProc(const char* strDll, const char* procName, HMODULE* DllHandle)
+static VOID *LoadProc(const WCHAR* strDll, const char* procName, HMODULE* DllHandle)
 {
     VOID* (*proc)(void);
 
-    *DllHandle = LoadLibraryExA(strDll, 0, LOAD_WITH_ALTERED_SEARCH_PATH);
+    *DllHandle = LoadLibraryExW(strDll, 0, LOAD_WITH_ALTERED_SEARCH_PATH);
     if(!*DllHandle)
     {
         output_write(STRING_DLL_LOAD_FAILED, strDll);
@@ -127,7 +128,7 @@ static VOID *LoadProc(const char* strDll, const char* procName, HMODULE* DllHand
     return proc;
 }
 
-static int RegisterDll(const char* strDll)
+static int RegisterDll(const WCHAR* strDll)
 {
     HRESULT hr;
     DLLREGISTER pfRegister;
@@ -150,7 +151,7 @@ static int RegisterDll(const char* strDll)
     return 0;
 }
 
-static int UnregisterDll(char* strDll)
+static int UnregisterDll(WCHAR* strDll)
 {
     HRESULT hr;
     DLLUNREGISTER pfUnregister;
@@ -173,7 +174,7 @@ static int UnregisterDll(char* strDll)
     return 0;
 }
 
-static int InstallDll(BOOL install, char *strDll, WCHAR *command_line)
+static int InstallDll(BOOL install, WCHAR *strDll, WCHAR *command_line)
 {
     HRESULT hr;
     DLLINSTALL pfInstall;
@@ -202,7 +203,7 @@ static int InstallDll(BOOL install, char *strDll, WCHAR *command_line)
     return 0;
 }
 
-int main(int argc, char* argv[])
+int wmain(int argc, WCHAR* argv[])
 {
     int             i, ch;
     BOOL            CallRegister = TRUE;
@@ -223,7 +224,7 @@ int main(int argc, char* argv[])
     {
         if ((argv[i][0] == '/' || argv[i][0] == '-') && (!argv[i][2] || argv[i][2] == ':'))
         {
-            ch = tolower(argv[i][1]);
+            ch = tolowerW(argv[i][1]);
 
             if (ch == 'u')
                 Unregister = TRUE;
@@ -235,12 +236,12 @@ int main(int argc, char* argv[])
                 /* console output */;
             else if (ch == 'i')
             {
-                char *command_line = argv[i] + strlen("/i");
+                WCHAR *command_line = argv[i] + 2; /* "/i" */
 
                 CallInstall = TRUE;
                 if (command_line[0] == ':' && command_line[1])
                 {
-                    int len = strlen(command_line);
+                    int len = lstrlenW(command_line);
 
                     command_line++;
                     len--;
@@ -256,15 +257,7 @@ int main(int argc, char* argv[])
                         }
                     }
                     if (command_line[0])
-                    {
-                        len = MultiByteToWideChar(CP_ACP, 0, command_line, -1,
-                                                  NULL, 0);
-                        wsCommandLine = HeapAlloc(GetProcessHeap(), 0,
-                                                  len * sizeof(WCHAR));
-                        if (wsCommandLine)
-                            MultiByteToWideChar(CP_ACP, 0, command_line, -1,
-                                                wsCommandLine, len);
-                    }
+                        wsCommandLine = command_line;
                     else
                         wsCommandLine = EmptyLine;
                 }
@@ -280,7 +273,7 @@ int main(int argc, char* argv[])
         }
         else
         {
-            char *DllName = argv[i];
+            WCHAR *DllName = argv[i];
             int res = 0;
 
             DllFound = TRUE;
diff --git a/programs/regsvr32/regsvr32.rc b/programs/regsvr32/regsvr32.rc
index 88ba364..3169b71 100644
--- a/programs/regsvr32/regsvr32.rc
+++ b/programs/regsvr32/regsvr32.rc
@@ -39,7 +39,7 @@ Options:\n\
 \  [/n]  Do not call DllRegisterServer. This option must be used with [/i].\n\n"
     STRING_UNRECOGNIZED_SWITCH, "regsvr32: Invalid or unrecognized switch [%1]\n\n"
     STRING_DLL_LOAD_FAILED, "regsvr32: Failed to load DLL '%1'\n"
-    STRING_PROC_NOT_IMPLEMENTED, "regsvr32: %1 not implemented in DLL '%2'\n"
+    STRING_PROC_NOT_IMPLEMENTED, "regsvr32: '%1!S!' not implemented in DLL '%2'\n"
     STRING_REGISTER_FAILED, "regsvr32: Failed to register DLL '%1'\n"
     STRING_REGISTER_SUCCESSFUL, "regsvr32: Successfully registered DLL '%1'\n"
     STRING_UNREGISTER_FAILED, "regsvr32: Failed to unregister DLL '%1'\n"
-- 
1.9.1




More information about the wine-patches mailing list