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