From: Hugh McMaster Subject: regsvr32: Add Unicode support (version 8) Message-Id: Date: Mon, 7 Jul 2014 18:47:42 +1000 Changelog: Convert programs/regsvr32/regsvr32.c to Unicode. This version makes use of a modified resource string (in the regsvr32.rc file). The wine.pot template has been updated accordingly, as the updated resource string fuzzies existing translations. Also, all non-relevant changes have been removed from this version. From f0ea73bae888a8f587de124c1b358ef8eb8f248a Mon Sep 17 00:00:00 2001 From: Hugh McMaster Date: Mon, 7 Jul 2014 18:29:03 +1000 Subject: regsvr32: Convert to Unicode (version 8) --- po/wine.pot | 2 +- programs/regsvr32/Makefile.in | 2 +- programs/regsvr32/regsvr32.c | 63 +++++++++++++++++++++++-------------------- programs/regsvr32/regsvr32.rc | 2 +- 4 files changed, 37 insertions(+), 32 deletions(-) diff --git a/po/wine.pot b/po/wine.pot index 2f371d0..6e9286f 100644 --- a/po/wine.pot +++ b/po/wine.pot @@ -11254,7 +11254,7 @@ msgid "regsvr32: Failed to load DLL '%1'\n" msgstr "" #: regsvr32.rc:43 -msgid "regsvr32: %1 not implemented in DLL '%2'\n" +msgid "regsvr32: The entry point '%1!S!' was not found in DLL '%2'\n" msgstr "" #: regsvr32.rc:44 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 624acd6..8fb6302 100644 --- a/programs/regsvr32/regsvr32.c +++ b/programs/regsvr32/regsvr32.c @@ -55,6 +55,7 @@ #include #include #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 * pDllHanlde - 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; BOOL CallRegister = TRUE; @@ -211,6 +212,16 @@ int main(int argc, char* argv[]) BOOL DllFound = FALSE; WCHAR* wsCommandLine = NULL; WCHAR EmptyLine[1] = {0}; + const WCHAR slashUW[] = {'/','u',0}; + const WCHAR hyphenUW[] = {'-','u',0}; + const WCHAR slashSW[] = {'/','s',0}; + const WCHAR hyphenSW[] = {'-','s',0}; + const WCHAR slashIW[] = {'/','i',0}; + const WCHAR hyphenIW[] = {'-','i',0}; + const WCHAR slashNW[] = {'/','n',0}; + const WCHAR hyphenNW[] = {'-','n',0}; + const WCHAR slashCW[] = {'/','c',0}; + const WCHAR hyphenCW[] = {'-','c',0}; OleInitialize(NULL); @@ -221,18 +232,18 @@ int main(int argc, char* argv[]) */ for(i = 1; i < argc; i++) { - if ((!strcasecmp(argv[i], "/u")) ||(!strcasecmp(argv[i], "-u"))) + if (!lstrcmpiW(argv[i], slashUW) || !lstrcmpiW(argv[i], hyphenUW)) Unregister = TRUE; - else if ((!strcasecmp(argv[i], "/s"))||(!strcasecmp(argv[i], "-s"))) + else if (!lstrcmpiW(argv[i], slashSW) || !lstrcmpiW(argv[i], hyphenSW)) Silent = TRUE; - else if ((!strncasecmp(argv[i], "/i", strlen("/i")))||(!strncasecmp(argv[i], "-i", strlen("-i")))) + else if (!strncmpiW(argv[i], slashIW, 2) || !strncmpiW(argv[i], hyphenIW, 2)) { - CHAR* command_line = argv[i] + strlen("/i"); + WCHAR* command_line = argv[i] + lstrlenW(slashIW); CallInstall = TRUE; if (command_line[0] == ':' && command_line[1]) { - int len = strlen(command_line); + int len = lstrlenW(command_line); command_line++; len--; @@ -249,13 +260,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 { @@ -267,9 +272,9 @@ int main(int argc, char* argv[]) wsCommandLine = EmptyLine; } } - else if((!strcasecmp(argv[i], "/n"))||(!strcasecmp(argv[i], "-n"))) + else if (!lstrcmpiW(argv[i], slashNW) || !lstrcmpiW(argv[i], hyphenNW)) CallRegister = FALSE; - else if((!strcasecmp(argv[i], "/c"))||(!strcasecmp(argv[i], "-c"))) + else if (!lstrcmpiW(argv[i], slashCW) || !lstrcmpiW(argv[i], hyphenCW)) /* console output */; else if (argv[i][0] == '/' && (!argv[i][2] || argv[i][2] == ':')) { @@ -279,7 +284,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 9b951b1..996d3b9 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: The entry point '%1!S!' was not found 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.8.3.2