changeset 16:51229bd6c24b

Correct use of multibyte/widechar conversion routines on Windows
author Chris Cannam
date Fri, 28 Oct 2016 12:10:54 +0100
parents 45ad9f91f977
children 78baaad4a001
files src/helper.cpp
diffstat 1 files changed, 9 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/helper.cpp	Fri Oct 28 11:32:12 2016 +0100
+++ b/src/helper.cpp	Fri Oct 28 12:10:54 2016 +0100
@@ -63,8 +63,10 @@
 #ifdef UNICODE
 static HMODULE LoadLibraryUTF8(std::string name) {
     int n = name.size();
-    wchar_t *wname = new wchar_t[n*2+1];
-    MultiByteToWideChar(CP_UTF8, 0, name.c_str(), n, wname, n*2);
+    int wn = MultiByteToWideChar(CP_UTF8, 0, name.c_str(), n, 0, 0);
+    wchar_t *wname = new wchar_t[wn+1];
+    wn = MultiByteToWideChar(CP_UTF8, 0, name.c_str(), n, wname, wn);
+    wname[wn] = L'\0';
     HMODULE h = LoadLibraryW(wname);
     delete[] wname;
     return h;
@@ -81,9 +83,11 @@
         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
         (LPTSTR) &buffer,
         0, NULL );
-    int n = wcslen(buffer);
-    char *text = new char[n*8 + 1];
-    WideCharToMultiByte(CP_UTF8, 0, buffer, n, text, n*8, 0, 0);
+    int wn = wcslen(buffer);
+    int n = WideCharToMultiByte(CP_UTF8, 0, buffer, wn, 0, 0, 0, 0);
+    char *text = new char[n+1];
+    n = WideCharToMultiByte(CP_UTF8, 0, buffer, wn, text, n, 0, 0);
+    text[n] = '\0';
     std::string s(text);
     LocalFree(&buffer);
     delete[] text;