static HRESULT WINAPI ActiveIMMApp_EscapeA(IActiveIMMApp* This, HKL hKL, HIMC hIMC, UINT uEscape, LPVOID pData, LRESULT *plResult) { *plResult = ImmEscapeA(hKL, hIMC, uEscape, pData); return S_OK; }
LRESULT WINAPI ImmEscapeW( HKL hKL, HIMC hImc, UINT uSubFunc, LPVOID lpData) { PIMEDPI pImeDpi; LRESULT lRet = 0; pImeDpi = FindOrLoadImeDpi(hKL); if (pImeDpi == NULL) { RIPMSG0(RIP_WARNING, "ImmEscapeW: no pImeDpi entry."); return lRet; } if ((pImeDpi->ImeInfo.fdwProperty & IME_PROP_UNICODE) || lpData == NULL) { /* * Doesn't need W/A conversion. Calls directly to IME to * bring up the configuration dialogbox. */ lRet = (*pImeDpi->pfn.ImeEscape)(hImc, uSubFunc, lpData); ImmUnlockImeDpi(pImeDpi); return lRet; } /* * Unicode caller, ANSI IME. Needs W/A conversion depending on * uSubFunc. */ switch (uSubFunc) { case IME_ESC_GET_EUDC_DICTIONARY: case IME_ESC_IME_NAME: { CHAR szData[IME_T_EUDC_DIC_SIZE]; INT i; lRet = ImmEscapeA(hKL, hImc, uSubFunc, (LPVOID)szData); if (lRet != 0) { try { i = MultiByteToWideChar(CP_ACP, (DWORD)MB_PRECOMPOSED, (LPSTR)szData, // src (INT)strlen(szData), (LPWSTR)lpData, // dest (INT)IME_T_EUDC_DIC_SIZE); ((LPWSTR)lpData)[i] = L'\0'; } except (EXCEPTION_EXECUTE_HANDLER) { lRet = 0; } } break; } case IME_ESC_SET_EUDC_DICTIONARY: case IME_ESC_HANJA_MODE: { CHAR szData[IME_T_EUDC_DIC_SIZE]; BOOL bUDC; INT i; i = WideCharToMultiByte( CP_ACP, (DWORD)0, (LPWSTR)lpData, // src (INT)wcslen(lpData), (LPSTR)szData, // dest (INT)sizeof(szData), (LPSTR)NULL, (LPBOOL)&bUDC); szData[i] = '\0'; lRet = ImmEscapeA(hKL, hImc, uSubFunc, (LPVOID)szData); break; } case IME_ESC_SEQUENCE_TO_INTERNAL: { CHAR szData[4]; WCHAR wszData[4]; INT i = 0; lRet = ImmEscapeA(hKL, hImc, uSubFunc, lpData); if (HIBYTE(LOWORD(lRet))) szData[i++] = HIBYTE(LOWORD(lRet)); if (LOBYTE(LOWORD(lRet))) szData[i++] = LOBYTE(LOWORD(lRet)); i = MultiByteToWideChar(CP_ACP, (DWORD)MB_PRECOMPOSED, (LPSTR)szData, // src i, (LPWSTR)wszData, // dest (INT)sizeof(wszData)/sizeof(WCHAR)); switch (i) { case 1: lRet = MAKELONG(wszData[0], 0); break; case 2: lRet = MAKELONG(wszData[1], wszData[0]); break; default: lRet = 0; break; } break; } default: lRet = ImmEscapeA(hKL, hImc, uSubFunc, lpData); break; } ImmUnlockImeDpi(pImeDpi); return lRet; }