[PATCH 3/7] reg: Use FormatMessage for easier internationalization support

Hugh McMaster hugh.mcmaster at outlook.com
Fri Feb 5 02:08:32 CST 2016


Signed-off-by: Hugh McMaster <hugh.mcmaster at outlook.com>
---
 programs/reg/reg.c | 28 +++++++++++++++++++---------
 1 file changed, 19 insertions(+), 9 deletions(-)

diff --git a/programs/reg/reg.c b/programs/reg/reg.c
index 56ee89a..179ed7d 100644
--- a/programs/reg/reg.c
+++ b/programs/reg/reg.c
@@ -18,10 +18,13 @@
 
 #include <windows.h>
 #include <wine/unicode.h>
+#include <wine/debug.h>
 #include "reg.h"
 
 #define ARRAY_SIZE(A) (sizeof(A)/sizeof(*A))
 
+WINE_DEFAULT_DEBUG_CHANNEL(reg);
+
 static const WCHAR short_hklm[] = {'H','K','L','M',0};
 static const WCHAR short_hkcu[] = {'H','K','C','U',0};
 static const WCHAR short_hkcr[] = {'H','K','C','R',0};
@@ -74,12 +77,10 @@ type_rels[] =
     {REG_MULTI_SZ, type_multi_sz},
 };
 
-static void output_writeconsole(const WCHAR *str)
+static void output_writeconsole(const WCHAR *str, DWORD wlen)
 {
-    int wlen;
     DWORD count, ret;
 
-    wlen = lstrlenW(str);
     ret = WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), str, wlen, &count, NULL);
     if (!ret)
     {
@@ -102,10 +103,19 @@ static void output_writeconsole(const WCHAR *str)
 
 static void output_formatstring(const WCHAR *fmt, __ms_va_list va_args)
 {
-    WCHAR msg_buffer[8192];
+    WCHAR *str;
+    DWORD len;
 
-    vsnprintfW(msg_buffer, sizeof(msg_buffer)/sizeof(WCHAR), fmt, va_args);
-    output_writeconsole(msg_buffer);
+    SetLastError(NO_ERROR);
+    len = FormatMessageW(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ALLOCATE_BUFFER,
+                         fmt, 0, 0, (LPWSTR)&str, 0, &va_args);
+    if (len == 0 && GetLastError() != NO_ERROR)
+    {
+        WINE_FIXME("Could not format string: le=%u, fmt=%s\n", GetLastError(), wine_dbgstr_w(fmt));
+        return;
+    }
+    output_writeconsole(str, len);
+    LocalFree(str);
 }
 
 static void reg_message(int msg)
@@ -114,7 +124,7 @@ static void reg_message(int msg)
 
     LoadStringW(GetModuleHandleW(NULL), msg, msg_buffer,
         sizeof(msg_buffer)/sizeof(WCHAR));
-    output_writeconsole(msg_buffer);
+    output_writeconsole(msg_buffer, strlenW(msg_buffer));
 }
 
 static void __cdecl output_array(const WCHAR *fmt, ...)
@@ -238,7 +248,7 @@ static LPBYTE get_regdata(LPWSTR data, DWORD reg_type, WCHAR separator, DWORD *r
         }
         default:
         {
-            static const WCHAR unhandled[] = {'U','n','h','a','n','d','l','e','d',' ','T','y','p','e',' ','0','x','%','x',' ',' ','d','a','t','a',' ','%','s','\n',0};
+            static const WCHAR unhandled[] = {'U','n','h','a','n','d','l','e','d',' ','T','y','p','e',' ','0','x','%','1','!','x','!',',',' ','d','a','t','a',' ','%','2','\n',0};
             output_array(unhandled, reg_type, data);
         }
     }
@@ -447,7 +457,7 @@ static int reg_query(WCHAR *key_name, WCHAR *value_name, BOOL value_empty,
     BOOL subkey)
 {
     static const WCHAR stubW[] = {'S','T','U','B',' ','Q','U','E','R','Y',' ',
-        '-',' ','%','s',' ','%','s',' ','%','d',' ','%','d','\n',0};
+        '-',' ','%','1',' ','%','2',' ','%','3','!','d','!',' ','%','4','!','d','!','\n',0};
     output_array(stubW, key_name, value_name, value_empty, subkey);
 
     return 1;
-- 
1.9.1




More information about the wine-patches mailing list