From c6d16d57e4518b6fc9ebea3346f2ab86ca8855cc Mon Sep 17 00:00:00 2001 From: Hugh McMaster Date: Tue, 4 Feb 2014 18:07:03 +1100 Subject: Add various regsvr32 writeconsole functions --- programs/regsvr32/Makefile.in | 2 +- programs/regsvr32/regsvr32.c | 63 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/programs/regsvr32/Makefile.in b/programs/regsvr32/Makefile.in index b2c4e1b..db567ea 100644 --- a/programs/regsvr32/Makefile.in +++ b/programs/regsvr32/Makefile.in @@ -1,6 +1,6 @@ MODULE = regsvr32.exe APPMODE = -mconsole -IMPORTS = ole32 +IMPORTS = ole32 user32 C_SRCS = \ regsvr32.c diff --git a/programs/regsvr32/regsvr32.c b/programs/regsvr32/regsvr32.c index 3536e93..2ea2117 100644 --- a/programs/regsvr32/regsvr32.c +++ b/programs/regsvr32/regsvr32.c @@ -56,6 +56,12 @@ #include #include +#include "wine/unicode.h" +#include "wine/debug.h" +#include "regsvr32.h" + +WINE_DEFAULT_DEBUG_CHANNEL(regsvr32); + typedef HRESULT (*DLLREGISTER) (void); typedef HRESULT (*DLLUNREGISTER) (void); typedef HRESULT (*DLLINSTALL) (BOOL,LPCWSTR); @@ -74,6 +80,63 @@ static int Usage(void) return 0; } +static void output_write(const WCHAR* str, DWORD len) +{ + DWORD nOut = 0, ret = 0; + + ret = WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), str, len, &nOut, NULL); + + /* WriteConsoleW() fails if the output is redirected. + * If this happens, we should call WriteFile(). */ + if (!ret) + { + DWORD lenA; + char *strA; + + lenA = WideCharToMultiByte(GetConsoleOutputCP(), 0, str, len, NULL, 0, NULL, NULL); + strA = HeapAlloc(GetProcessHeap(), 0, lenA); + if (!strA) return; + + WideCharToMultiByte(GetConsoleOutputCP(), 0, str, len, strA, lenA, NULL, NULL); + WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), strA, len, &nOut, FALSE); + HeapFree(GetProcessHeap(), 0, strA); + } +} + +static int __cdecl format_string(const WCHAR *fmt, ...) +{ + __ms_va_list va_args; + WCHAR *str; + DWORD len; + + __ms_va_start(va_args, fmt); + SetLastError(NO_ERROR); + 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_w(fmt)); + else + { + output_write(str, len); + LocalFree(str); + } + return 0; +} + +static WCHAR *load_message(UINT id) +{ + static WCHAR msg[1024]; + static const WCHAR failed[] = {'F','a','i','l','e','d','!','\0'}; + + if (!LoadStringW(GetModuleHandleW(NULL), id, msg, sizeof(msg)/sizeof(WCHAR))) + { + WINE_FIXME("LoadString failed with %d\n", GetLastError()); + strcpyW(msg, failed); + } + return msg; +} + /** * Loads procedure. * -- 1.8.3.2