[IMM32] Rewrite ImmInstallIMEA (#3873)
authorKatayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
Tue, 3 Aug 2021 22:32:13 +0000 (07:32 +0900)
committerGitHub <noreply@github.com>
Tue, 3 Aug 2021 22:32:13 +0000 (07:32 +0900)
Implementing Japanese input... CORE-11700

dll/win32/imm32/imm.c

index 9c7aa19..62f1569 100644 (file)
@@ -2808,21 +2808,33 @@ UINT WINAPI ImmGetVirtualKey(HWND hWnd)
 HKL WINAPI ImmInstallIMEA(
   LPCSTR lpszIMEFileName, LPCSTR lpszLayoutText)
 {
-    LPWSTR lpszwIMEFileName;
-    LPWSTR lpszwLayoutText;
-    HKL hkl;
+    INT cchFileName, cchLayoutText;
+    LPWSTR pszFileNameW, pszLayoutTextW;
+    HKL hKL;
 
-    TRACE ("(%s, %s)\n", debugstr_a(lpszIMEFileName),
-                         debugstr_a(lpszLayoutText));
+    TRACE("(%s, %s)\n", debugstr_a(lpszIMEFileName), debugstr_a(lpszLayoutText));
 
-    lpszwIMEFileName = strdupAtoW(lpszIMEFileName);
-    lpszwLayoutText = strdupAtoW(lpszLayoutText);
+    cchFileName = lstrlenA(lpszIMEFileName) + 1;
+    cchLayoutText = lstrlenA(lpszLayoutText) + 1;
 
-    hkl = ImmInstallIMEW(lpszwIMEFileName, lpszwLayoutText);
+    pszFileNameW = Imm32HeapAlloc(0, cchFileName * sizeof(WCHAR));
+    if (pszFileNameW == NULL)
+        return NULL;
 
-    HeapFree(GetProcessHeap(),0,lpszwIMEFileName);
-    HeapFree(GetProcessHeap(),0,lpszwLayoutText);
-    return hkl;
+    pszLayoutTextW = Imm32HeapAlloc(0, cchLayoutText * sizeof(WCHAR));
+    if (pszLayoutTextW == NULL)
+    {
+        HeapFree(g_hImm32Heap, 0, pszFileNameW);
+        return NULL;
+    }
+
+    MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lpszIMEFileName, -1, pszFileNameW, cchFileName);
+    MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lpszLayoutText, -1, pszLayoutTextW, cchLayoutText);
+
+    hKL = ImmInstallIMEW(pszFileNameW, pszLayoutTextW);
+    HeapFree(g_hImm32Heap, 0, pszFileNameW);
+    HeapFree(g_hImm32Heap, 0, pszLayoutTextW);
+    return hKL;
 }
 
 /***********************************************************************