https://git.reactos.org/?p=reactos.git;a=commitdiff;h=1da5d7a305b023c687f29…
commit 1da5d7a305b023c687f29c0aa717e03989bf4bf4
Author: Katayama Hirofumi MZ <katayama.hirofumi.mz(a)gmail.com>
AuthorDate: Sat Aug 14 10:38:06 2021 +0900
Commit: GitHub <noreply(a)github.com>
CommitDate: Sat Aug 14 10:38:06 2021 +0900
[IMM32] Refactor and simplify code (#3900)
- Add Imm32WideFromAnsi, Imm32AnsiFromWide and Imm32IsCrossThreadAccess helper
functions.
- Simplify the IMM32 code by using the helper functions.
CORE-11700
---
dll/win32/imm32/imm.c | 211 ++++++++++++++++++++------------------------------
1 file changed, 82 insertions(+), 129 deletions(-)
diff --git a/dll/win32/imm32/imm.c b/dll/win32/imm32/imm.c
index 918b99502a9..29e8aba138d 100644
--- a/dll/win32/imm32/imm.c
+++ b/dll/win32/imm32/imm.c
@@ -96,6 +96,29 @@ LPVOID APIENTRY Imm32HeapAlloc(DWORD dwFlags, DWORD dwBytes)
return HeapAlloc(g_hImm32Heap, dwFlags, dwBytes);
}
+static LPWSTR APIENTRY Imm32WideFromAnsi(LPCSTR pszA)
+{
+ INT cch = lstrlenA(pszA);
+ LPWSTR pszW = Imm32HeapAlloc(0, (cch + 1) * sizeof(WCHAR));
+ if (pszW == NULL)
+ return NULL;
+ cch = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, pszA, cch, pszW, cch + 1);
+ pszW[cch] = 0;
+ return pszW;
+}
+
+static LPSTR APIENTRY Imm32AnsiFromWide(LPCWSTR pszW)
+{
+ INT cchW = lstrlenW(pszW);
+ INT cchA = (cchW + 1) * sizeof(WCHAR);
+ LPSTR pszA = Imm32HeapAlloc(0, cchA);
+ if (!pszA)
+ return NULL;
+ cchA = WideCharToMultiByte(CP_ACP, 0, pszW, cchW, pszA, cchA, NULL, NULL);
+ pszA[cchA] = 0;
+ return pszA;
+}
+
static DWORD_PTR APIENTRY Imm32QueryWindow(HWND hWnd, DWORD Index)
{
return NtUserQueryWindow(hWnd, Index);
@@ -112,6 +135,13 @@ static DWORD APIENTRY Imm32QueryInputContext(HIMC hIMC, DWORD
dwUnknown2)
return NtUserQueryInputContext(hIMC, dwUnknown2);
}
+static inline BOOL Imm32IsCrossThreadAccess(HIMC hIMC)
+{
+ DWORD dwImeThreadId = Imm32QueryInputContext(hIMC, 1);
+ DWORD dwThreadId = GetCurrentThreadId();
+ return (dwImeThreadId != dwThreadId);
+}
+
static DWORD APIENTRY Imm32NotifyIMEStatus(HWND hwnd, HIMC hIMC, DWORD dwConversion)
{
return NtUserNotifyIMEStatus(hwnd, hIMC, dwConversion);
@@ -416,6 +446,9 @@ static PIMEDPI APIENTRY Ime32LoadImeDpi(HKL hKL, BOOL bLock)
}
}
+/***********************************************************************
+ * ImmLoadIME (IMM32.@)
+ */
BOOL WINAPI ImmLoadIME(HKL hKL)
{
PW32CLIENTINFO pInfo;
@@ -458,6 +491,9 @@ PIMEDPI APIENTRY ImmLockOrLoadImeDpi(HKL hKL)
return pImeDpi;
}
+/***********************************************************************
+ * ImmLoadLayout (IMM32.@)
+ */
HKL WINAPI ImmLoadLayout(HKL hKL, PIMEINFOEX pImeInfoEx)
{
DWORD cbData;
@@ -1113,7 +1149,6 @@ BOOL APIENTRY Imm32CleanupContext(HIMC hIMC, HKL hKL, BOOL bKeep)
*/
BOOL WINAPI ImmDestroyContext(HIMC hIMC)
{
- DWORD dwImeThreadId, dwThreadId;
HKL hKL;
TRACE("(%p)\n", hIMC);
@@ -1121,9 +1156,7 @@ BOOL WINAPI ImmDestroyContext(HIMC hIMC)
if (g_psi == NULL || !(g_psi->dwSRVIFlags & SRVINFO_IMM32))
return FALSE;
- dwImeThreadId = Imm32QueryInputContext(hIMC, 1);
- dwThreadId = GetCurrentThreadId();
- if (dwImeThreadId != dwThreadId)
+ if (Imm32IsCrossThreadAccess(hIMC))
return FALSE;
hKL = GetKeyboardLayout(0);
@@ -1505,17 +1538,11 @@ static BOOL APIENTRY Imm32KEnglish(HIMC hIMC)
static BOOL APIENTRY Imm32ProcessHotKey(HWND hWnd, HIMC hIMC, HKL hKL, DWORD dwHotKeyID)
{
- DWORD dwImeThreadId, dwThreadId;
PIMEDPI pImeDpi;
BOOL ret;
- if (hIMC)
- {
- dwImeThreadId = Imm32QueryInputContext(hIMC, 1);
- dwThreadId = GetCurrentThreadId();
- if (dwImeThreadId != dwThreadId)
- return FALSE;
- }
+ if (hIMC && Imm32IsCrossThreadAccess(hIMC))
+ return FALSE;
switch (dwHotKeyID)
{
@@ -1565,6 +1592,9 @@ static BOOL APIENTRY Imm32ProcessHotKey(HWND hWnd, HIMC hIMC, HKL
hKL, DWORD dwH
return ret;
}
+/***********************************************************************
+ * ImmLockClientImc (IMM32.@)
+ */
PCLIENTIMC WINAPI ImmLockClientImc(HIMC hImc)
{
PCLIENTIMC pClientImc;
@@ -1602,6 +1632,9 @@ PCLIENTIMC WINAPI ImmLockClientImc(HIMC hImc)
return pClientImc;
}
+/***********************************************************************
+ * ImmUnlockClientImc (IMM32.@)
+ */
VOID WINAPI ImmUnlockClientImc(PCLIENTIMC pClientImc)
{
LONG cLocks;
@@ -2403,7 +2436,6 @@ BOOL WINAPI ImmGetCompositionWindow(HIMC hIMC, LPCOMPOSITIONFORM
lpCompForm)
/***********************************************************************
* ImmGetContext (IMM32.@)
- *
*/
HIMC WINAPI ImmGetContext(HWND hWnd)
{
@@ -2443,7 +2475,6 @@ DWORD WINAPI ImmGetConversionListA(
DWORD dwBufLen, UINT uFlag)
{
DWORD ret = 0;
- INT cchA, cchW;
UINT cb;
LPWSTR pszSrcW = NULL;
LPCANDIDATELIST pCL = NULL;
@@ -2465,13 +2496,9 @@ DWORD WINAPI ImmGetConversionListA(
if (pSrc)
{
- cchA = lstrlenA(pSrc);
- cchW = cchA + 1;
- pszSrcW = Imm32HeapAlloc(0, cchW * sizeof(WCHAR));
+ pszSrcW = Imm32WideFromAnsi(pSrc);
if (pszSrcW == NULL)
goto Quit;
- cchW = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, pSrc, cchA, pszSrcW, cchW);
- pszSrcW[cchW] = 0;
}
cb = pImeDpi->ImeConversionList(hIMC, pszSrcW, NULL, 0, uFlag);
@@ -2506,8 +2533,7 @@ DWORD WINAPI ImmGetConversionListW(
DWORD dwBufLen, UINT uFlag)
{
DWORD ret = 0;
- INT cb, cchW;
- BOOL bUsedDefault;
+ INT cb;
PIMEDPI pImeDpi;
LPCANDIDATELIST pCL = NULL;
LPSTR pszSrcA = NULL;
@@ -2528,13 +2554,9 @@ DWORD WINAPI ImmGetConversionListW(
if (pSrc)
{
- cchW = lstrlenW(pSrc);
- cb = (cchW + 1) * 2;
- pszSrcA = Imm32HeapAlloc(0, cb);
+ pszSrcA = Imm32AnsiFromWide(pSrc);
if (pszSrcA == NULL)
goto Quit;
- cb = WideCharToMultiByte(CP_ACP, 0, pSrc, cchW, pszSrcA, cb, NULL,
&bUsedDefault);
- pszSrcA[cb] = 0;
}
cb = pImeDpi->ImeConversionList(hIMC, pszSrcA, NULL, 0, uFlag);
@@ -3166,32 +3188,26 @@ UINT WINAPI ImmGetVirtualKey(HWND hWnd)
HKL WINAPI ImmInstallIMEA(
LPCSTR lpszIMEFileName, LPCSTR lpszLayoutText)
{
- INT cchFileName, cchLayoutText;
- LPWSTR pszFileNameW, pszLayoutTextW;
- HKL hKL;
+ HKL hKL = NULL;
+ LPWSTR pszFileNameW = NULL, pszLayoutTextW = NULL;
TRACE("(%s, %s)\n", debugstr_a(lpszIMEFileName),
debugstr_a(lpszLayoutText));
- cchFileName = lstrlenA(lpszIMEFileName) + 1;
- cchLayoutText = lstrlenA(lpszLayoutText) + 1;
-
- pszFileNameW = Imm32HeapAlloc(0, cchFileName * sizeof(WCHAR));
+ pszFileNameW = Imm32WideFromAnsi(lpszIMEFileName);
if (pszFileNameW == NULL)
- return NULL;
+ goto Quit;
- pszLayoutTextW = Imm32HeapAlloc(0, cchLayoutText * sizeof(WCHAR));
+ pszLayoutTextW = Imm32WideFromAnsi(lpszLayoutText);
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);
+ goto Quit;
hKL = ImmInstallIMEW(pszFileNameW, pszLayoutTextW);
- HeapFree(g_hImm32Heap, 0, pszFileNameW);
- HeapFree(g_hImm32Heap, 0, pszLayoutTextW);
+
+Quit:
+ if (pszFileNameW)
+ HeapFree(g_hImm32Heap, 0, pszFileNameW);
+ if (pszLayoutTextW)
+ HeapFree(g_hImm32Heap, 0, pszLayoutTextW);
return hKL;
}
@@ -3313,20 +3329,14 @@ BOOL WINAPI ImmIsUIMessageW(
BOOL WINAPI ImmNotifyIME(
HIMC hIMC, DWORD dwAction, DWORD dwIndex, DWORD dwValue)
{
- DWORD dwImeThreadId, dwThreadId;
HKL hKL;
PIMEDPI pImeDpi;
BOOL ret;
TRACE("(%p, %lu, %lu, %lu)\n", hIMC, dwAction, dwIndex, dwValue);
- if (hIMC)
- {
- dwImeThreadId = Imm32QueryWindow(hIMC, QUERY_WINDOW_UNIQUE_THREAD_ID);
- dwThreadId = GetCurrentThreadId();
- if (dwImeThreadId != dwThreadId)
- return FALSE;
- }
+ if (hIMC && Imm32IsCrossThreadAccess(hIMC))
+ return FALSE;
hKL = GetKeyboardLayout(0);
pImeDpi = ImmLockImeDpi(hKL);
@@ -3347,7 +3357,6 @@ BOOL WINAPI ImmRegisterWordA(
BOOL ret = FALSE;
PIMEDPI pImeDpi;
LPWSTR pszReadingW = NULL, pszRegisterW = NULL;
- INT cch;
TRACE("(%p, %s, 0x%lX, %s)\n", hKL, debugstr_a(lpszReading), dwStyle,
debugstr_a(lpszRegister));
@@ -3365,24 +3374,16 @@ BOOL WINAPI ImmRegisterWordA(
if (lpszReading)
{
- cch = lstrlenA(lpszReading);
- pszReadingW = Imm32HeapAlloc(0, (cch + 1) * sizeof(WCHAR));
+ pszReadingW = Imm32WideFromAnsi(lpszReading);
if (pszReadingW == NULL)
goto Quit;
- cch = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lpszReading, cch,
- pszReadingW, cch + 1);
- pszReadingW[cch] = 0;
}
if (lpszRegister)
{
- cch = lstrlenA(lpszRegister);
- pszRegisterW = Imm32HeapAlloc(0, (cch + 1) * sizeof(WCHAR));
+ pszRegisterW = Imm32WideFromAnsi(lpszRegister);
if (pszRegisterW == NULL)
goto Quit;
- cch = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lpszRegister, cch,
- pszRegisterW, cch + 1);
- pszRegisterW[cch] = 0;
}
ret = pImeDpi->ImeRegisterWord(pszReadingW, dwStyle, pszRegisterW);
@@ -3405,7 +3406,6 @@ BOOL WINAPI ImmRegisterWordW(
BOOL ret = FALSE;
PIMEDPI pImeDpi;
LPSTR pszReadingA = NULL, pszRegisterA = NULL;
- INT cchW, cchA;
TRACE("(%p, %s, 0x%lX, %s)\n", hKL, debugstr_w(lpszReading), dwStyle,
debugstr_w(lpszRegister));
@@ -3423,24 +3423,16 @@ BOOL WINAPI ImmRegisterWordW(
if (lpszReading)
{
- cchW = lstrlenW(lpszReading);
- cchA = (cchW + 1) * sizeof(WCHAR);
- pszReadingA = Imm32HeapAlloc(0, cchA);
+ pszReadingA = Imm32AnsiFromWide(lpszReading);
if (!pszReadingA)
goto Quit;
- cchA = WideCharToMultiByte(CP_ACP, 0, lpszReading, cchW, pszReadingA, cchA, NULL,
NULL);
- pszReadingA[cchA] = 0;
}
if (lpszRegister)
{
- cchW = lstrlenW(lpszRegister);
- cchA = (cchW + 1) * sizeof(WCHAR);
- pszRegisterA = Imm32HeapAlloc(0, cchA);
+ pszRegisterA = Imm32AnsiFromWide(lpszRegister);
if (!pszRegisterA)
goto Quit;
- cchA = WideCharToMultiByte(CP_ACP, 0, lpszRegister, cchW, pszRegisterA, cchA,
NULL, NULL);
- pszRegisterA[cchA] = 0;
}
ret = pImeDpi->ImeRegisterWord(pszReadingA, dwStyle, pszRegisterA);
@@ -3505,7 +3497,6 @@ BOOL WINAPI ImmSetCandidateWindow(
HIMC hIMC, LPCANDIDATEFORM lpCandidate)
{
#define MAX_CANDIDATEFORM 4
- DWORD dwImeThreadId, dwThreadId;
HWND hWnd;
LPINPUTCONTEXT pIC;
@@ -3514,9 +3505,7 @@ BOOL WINAPI ImmSetCandidateWindow(
if (lpCandidate->dwIndex >= MAX_CANDIDATEFORM)
return FALSE;
- dwImeThreadId = Imm32QueryInputContext(hIMC, 1);
- dwThreadId = GetCurrentThreadId();
- if (dwImeThreadId != dwThreadId)
+ if (Imm32IsCrossThreadAccess(hIMC))
return FALSE;
pIC = ImmLockIMC(hIMC);
@@ -3565,7 +3554,6 @@ static VOID APIENTRY AnsiToWideLogFont(const LOGFONTA *plfA,
LPLOGFONTW plfW)
BOOL WINAPI ImmSetCompositionFontA(HIMC hIMC, LPLOGFONTA lplf)
{
LOGFONTW lfW;
- DWORD dwImeThreadId, dwThreadId;
PCLIENTIMC pClientImc;
BOOL bWide;
LPINPUTCONTEXTDX pIC;
@@ -3575,9 +3563,7 @@ BOOL WINAPI ImmSetCompositionFontA(HIMC hIMC, LPLOGFONTA lplf)
TRACE("(%p, %p)\n", hIMC, lplf);
- dwImeThreadId = Imm32QueryInputContext(hIMC, 1);
- dwThreadId = GetCurrentThreadId();
- if (dwImeThreadId != dwThreadId)
+ if (Imm32IsCrossThreadAccess(hIMC))
return FALSE;
pClientImc = ImmLockClientImc(hIMC);
@@ -3625,7 +3611,6 @@ BOOL WINAPI ImmSetCompositionFontA(HIMC hIMC, LPLOGFONTA lplf)
BOOL WINAPI ImmSetCompositionFontW(HIMC hIMC, LPLOGFONTW lplf)
{
LOGFONTA lfA;
- DWORD dwImeThreadId, dwThreadId;
PCLIENTIMC pClientImc;
BOOL bWide;
HWND hWnd;
@@ -3635,9 +3620,7 @@ BOOL WINAPI ImmSetCompositionFontW(HIMC hIMC, LPLOGFONTW lplf)
TRACE("(%p, %p)\n", hIMC, lplf);
- dwImeThreadId = Imm32QueryInputContext(hIMC, 1);
- dwThreadId = GetCurrentThreadId();
- if (dwImeThreadId != dwThreadId)
+ if (Imm32IsCrossThreadAccess(hIMC))
return FALSE;
pClientImc = ImmLockClientImc(hIMC);
@@ -3800,13 +3783,10 @@ BOOL WINAPI ImmSetCompositionStringW(
BOOL WINAPI ImmSetCompositionWindow(
HIMC hIMC, LPCOMPOSITIONFORM lpCompForm)
{
- DWORD dwImeThreadId, dwThreadId;
LPINPUTCONTEXT pIC;
HWND hWnd;
- dwImeThreadId = NtUserQueryInputContext(hIMC, 1);
- dwThreadId = GetCurrentThreadId();
- if (dwImeThreadId != dwThreadId)
+ if (Imm32IsCrossThreadAccess(hIMC))
return FALSE;
pIC = ImmLockIMC(hIMC);
@@ -3833,7 +3813,7 @@ BOOL WINAPI ImmSetConversionStatus(
{
HKL hKL;
LPINPUTCONTEXT pIC;
- DWORD dwImeThreadId, dwThreadId, dwOldConversion, dwOldSentence;
+ DWORD dwOldConversion, dwOldSentence;
BOOL fConversionChange = FALSE, fSentenceChange = FALSE;
HWND hWnd;
@@ -3849,9 +3829,7 @@ BOOL WINAPI ImmSetConversionStatus(
}
}
- dwImeThreadId = Imm32QueryInputContext(hIMC, 1);
- dwThreadId = GetCurrentThreadId();
- if (dwImeThreadId != dwThreadId)
+ if (Imm32IsCrossThreadAccess(hIMC))
return FALSE;
pIC = ImmLockIMC(hIMC);
@@ -3973,16 +3951,14 @@ VOID WINAPI ImmUnlockImeDpi(PIMEDPI pImeDpi)
*/
BOOL WINAPI ImmSetOpenStatus(HIMC hIMC, BOOL fOpen)
{
- DWORD dwImeThreadId, dwThreadId, dwConversion;
+ DWORD dwConversion;
LPINPUTCONTEXT pIC;
HWND hWnd;
BOOL bHasChange = FALSE;
TRACE("(%p, %d)\n", hIMC, fOpen);
- dwImeThreadId = Imm32QueryInputContext(hIMC, 1);
- dwThreadId = GetCurrentThreadId();
- if (dwImeThreadId != dwThreadId)
+ if (Imm32IsCrossThreadAccess(hIMC))
return FALSE;
pIC = ImmLockIMC(hIMC);
@@ -4016,13 +3992,10 @@ BOOL WINAPI ImmSetStatusWindowPos(HIMC hIMC, LPPOINT lpptPos)
{
LPINPUTCONTEXT pIC;
HWND hWnd;
- DWORD dwImeThreadId, dwThreadId;
TRACE("(%p, {%ld, %ld})\n", hIMC, lpptPos->x, lpptPos->y);
- dwImeThreadId = Imm32QueryInputContext(hIMC, 1);
- dwThreadId = GetCurrentThreadId();
- if (dwImeThreadId != dwThreadId)
+ if (Imm32IsCrossThreadAccess(hIMC))
return FALSE;
pIC = ImmLockIMC(hIMC);
@@ -4099,7 +4072,6 @@ BOOL WINAPI ImmUnregisterWordA(
BOOL ret = FALSE;
PIMEDPI pImeDpi;
LPWSTR pszReadingW = NULL, pszUnregisterW = NULL;
- INT cch;
TRACE("(%p, %s, 0x%lX, %s)\n", hKL, debugstr_a(lpszReading), dwStyle,
debugstr_a(lpszUnregister));
@@ -4117,24 +4089,16 @@ BOOL WINAPI ImmUnregisterWordA(
if (lpszReading)
{
- cch = lstrlenA(lpszReading);
- pszReadingW = Imm32HeapAlloc(0, (cch + 1) * sizeof(WCHAR));
+ pszReadingW = Imm32WideFromAnsi(lpszReading);
if (pszReadingW == NULL)
goto Quit;
- cch = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lpszReading, cch,
- pszReadingW, cch + 1);
- pszReadingW[cch] = 0;
}
if (lpszUnregister)
{
- cch = lstrlenA(lpszUnregister);
- pszUnregisterW = Imm32HeapAlloc(0, (cch + 1) * sizeof(WCHAR));
+ pszUnregisterW = Imm32WideFromAnsi(lpszUnregister);
if (pszUnregisterW == NULL)
goto Quit;
- cch = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lpszUnregister, cch,
- pszUnregisterW, cch + 1);
- pszUnregisterW[cch] = 0;
}
ret = pImeDpi->ImeUnregisterWord(pszReadingW, dwStyle, pszUnregisterW);
@@ -4157,7 +4121,6 @@ BOOL WINAPI ImmUnregisterWordW(
BOOL ret = FALSE;
PIMEDPI pImeDpi;
LPSTR pszReadingA = NULL, pszUnregisterA = NULL;
- INT cchW, cchA;
TRACE("(%p, %s, 0x%lX, %s)\n", hKL, debugstr_w(lpszReading), dwStyle,
debugstr_w(lpszUnregister));
@@ -4175,24 +4138,16 @@ BOOL WINAPI ImmUnregisterWordW(
if (lpszReading)
{
- cchW = lstrlenW(lpszReading);
- cchA = (cchW + 1) * sizeof(WCHAR);
- pszReadingA = Imm32HeapAlloc(0, cchA);
+ pszReadingA = Imm32AnsiFromWide(lpszReading);
if (!pszReadingA)
goto Quit;
- cchA = WideCharToMultiByte(CP_ACP, 0, lpszReading, cchW, pszReadingA, cchA, NULL,
NULL);
- pszReadingA[cchA] = 0;
}
if (lpszUnregister)
{
- cchW = lstrlenW(lpszUnregister);
- cchA = (cchW + 1) * sizeof(WCHAR);
- pszUnregisterA = Imm32HeapAlloc(0, cchA);
+ pszUnregisterA = Imm32AnsiFromWide(lpszUnregister);
if (!pszUnregisterA)
goto Quit;
- cchA = WideCharToMultiByte(CP_ACP, 0, lpszUnregister, cchW, pszUnregisterA, cchA,
NULL, NULL);
- pszUnregisterA[cchA] = 0;
}
ret = pImeDpi->ImeUnregisterWord(pszReadingA, dwStyle, pszUnregisterA);
@@ -4660,7 +4615,6 @@ BOOL WINAPI ImmEnumInputContext(DWORD dwThreadId, IMCENUMPROC lpfn,
LPARAM lPara
/***********************************************************************
* ImmGetHotKey(IMM32.@)
*/
-
BOOL WINAPI
ImmGetHotKey(IN DWORD dwHotKey,
OUT LPUINT lpuModifiers,
@@ -4727,15 +4681,14 @@ BOOL WINAPI CtfImmIsTextFrameServiceDisabled(VOID)
return FALSE;
}
-/***********************************************************************
- * ImmGetImeInfoEx (IMM32.@)
- */
-
static BOOL APIENTRY Imm32GetImeInfoEx(PIMEINFOEX pImeInfoEx, IMEINFOEXCLASS SearchType)
{
return NtUserGetImeInfoEx(pImeInfoEx, SearchType);
}
+/***********************************************************************
+ * ImmGetImeInfoEx (IMM32.@)
+ */
BOOL WINAPI
ImmGetImeInfoEx(PIMEINFOEX pImeInfoEx,
IMEINFOEXCLASS SearchType,