static HRESULT WINAPI ActiveIMMApp_ConfigureIMEW(IActiveIMMApp* This, HKL hKL, HWND hWnd, DWORD dwMode, REGISTERWORDW *pData) { BOOL rc; rc = ImmConfigureIMEW(hKL, hWnd, dwMode, pData); if (rc) return E_FAIL; else return S_OK; }
static void test_ImmIME(void) { HIMC imc; imc = ImmGetContext(hwnd); if (imc) { BOOL rc; rc = ImmConfigureIMEA(imc, NULL, IME_CONFIG_REGISTERWORD, NULL); ok (rc == 0, "ImmConfigureIMEA did not fail\n"); rc = ImmConfigureIMEW(imc, NULL, IME_CONFIG_REGISTERWORD, NULL); ok (rc == 0, "ImmConfigureIMEW did not fail\n"); } ImmReleaseContext(hwnd,imc); }
BOOL WINAPI ImmConfigureIMEA( HKL hKL, HWND hWnd, DWORD dwMode, LPVOID lpData) { PWND pWnd; PIMEDPI pImeDpi; BOOL fRet = FALSE; if ((pWnd = ValidateHwnd(hWnd)) == (PWND)NULL) { RIPMSG1(RIP_WARNING, "ImmConfigureIMEA: invalid window handle %x", hWnd); return FALSE; } if (!TestWindowProcess(pWnd)) { RIPMSG1(RIP_WARNING, "ImmConfigureIMEA: hWnd=%lx belongs to different process!", hWnd); return FALSE; } pImeDpi = FindOrLoadImeDpi(hKL); if (pImeDpi == NULL) { RIPMSG0(RIP_WARNING, "ImmConfigureIMEA: no pImeDpi entry."); return FALSE; } 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. */ fRet = (*pImeDpi->pfn.ImeConfigure)(hKL, hWnd, dwMode, lpData); ImmUnlockImeDpi(pImeDpi); return fRet; } /* * ANSI caller, Unicode IME. Needs A/W conversion on lpData when * dwMode == IME_CONFIG_REGISTERWORD. In this case, lpData points * to a structure of REGISTERWORDA. */ switch (dwMode) { case IME_CONFIG_REGISTERWORD: { LPREGISTERWORDA lpRegisterWordA; REGISTERWORDW RegisterWordW; LPVOID lpBuffer; ULONG cbBuffer; INT i; lpRegisterWordA = (LPREGISTERWORDA)lpData; cbBuffer = 0; lpBuffer = NULL; if (lpRegisterWordA->lpReading != NULL) cbBuffer += strlen(lpRegisterWordA->lpReading) + 1; if (lpRegisterWordA->lpWord != NULL) cbBuffer += strlen(lpRegisterWordA->lpWord) + 1; if (cbBuffer != 0) { cbBuffer *= sizeof(WCHAR); if ((lpBuffer = ImmLocalAlloc(0, cbBuffer)) == NULL) { RIPMSG0(RIP_WARNING, "ImmConfigureIMEA: memory failure."); break; } } if (lpRegisterWordA->lpReading != NULL) { RegisterWordW.lpReading = lpBuffer; i = MultiByteToWideChar(CP_ACP, (DWORD)MB_PRECOMPOSED, (LPSTR)lpRegisterWordA->lpReading, (INT)strlen(lpRegisterWordA->lpReading), (LPWSTR)RegisterWordW.lpReading, (INT)(cbBuffer/sizeof(WCHAR))); RegisterWordW.lpReading[i] = L'\0'; cbBuffer -= (i * sizeof(WCHAR)); } else { RegisterWordW.lpReading = NULL; } if (lpRegisterWordA->lpWord != NULL) { if (RegisterWordW.lpReading != NULL) RegisterWordW.lpWord = &RegisterWordW.lpReading[i+1]; else RegisterWordW.lpWord = lpBuffer; i = MultiByteToWideChar(CP_ACP, (DWORD)MB_PRECOMPOSED, (LPSTR)lpRegisterWordA->lpWord, (INT)strlen(lpRegisterWordA->lpWord), (LPWSTR)RegisterWordW.lpWord, (INT)(cbBuffer/sizeof(WCHAR))); RegisterWordW.lpWord[i] = L'\0'; } else RegisterWordW.lpWord = NULL; fRet = ImmConfigureIMEW(hKL, hWnd, dwMode, &RegisterWordW); if (lpBuffer != NULL) ImmLocalFree(lpBuffer); break; } default: fRet = ImmConfigureIMEW(hKL, hWnd, dwMode, lpData); break; } ImmUnlockImeDpi(pImeDpi); return fRet; }