static void test_ImmDestroyIMCC(void) { HIMCC imcc; DWORD ret, count, size; VOID *p; imcc = ImmCreateIMCC(sizeof(CANDIDATEINFO)); count = ImmGetIMCCLockCount(imcc); ok(count == 0, "expect 0, returned %d\n", count); p = ImmLockIMCC(imcc); ok(p != NULL, "ImmLockIMCC failed!\n"); count = ImmGetIMCCLockCount(imcc); ok(count == 1, "expect 1, returned %d\n", count); size = ImmGetIMCCSize(imcc); ok(size == sizeof(CANDIDATEINFO), "returned %d\n", size); p = ImmDestroyIMCC(imcc); ok(p == NULL, "Destroy a locked IMCC should success!\n"); p = ImmLockIMCC(imcc); ok(p == NULL, "Lock a destroyed IMCC should fail!\n"); ret = ImmUnlockIMCC(imcc); ok(ret == FALSE, "Unlock a destroyed IMCC should return FALSE!\n"); count = ImmGetIMCCLockCount(imcc); ok(count == 0, "Get lock count of a destroyed IMCC should return 0!\n"); size = ImmGetIMCCSize(imcc); ok(size == 0, "Get size of a destroyed IMCC should return 0!\n"); SetLastError(0xdeadbeef); p = ImmDestroyIMCC(imcc); ok(p != NULL, "returned NULL\n"); ret = GetLastError(); ok(ret == ERROR_INVALID_HANDLE, "wrong last error %08x!\n", ret); }
bool CompString::create() { HIMCC& handle = imc_->hCompStr; if (!handle) { handle = ImmCreateIMCC(sizeof(myCompStr)); if (!handle) return false; } else if (ImmGetIMCCSize(handle) < sizeof(myCompStr)) { HIMCC temp = ImmReSizeIMCC(handle, sizeof(myCompStr)); if (!temp) return false; handle = temp; } cs_ = (COMPOSITIONSTRING*)ImmLockIMCC(handle); if (!cs_) return false; ZeroMemory(cs_, sizeof(myCompStr)); cs_->dwSize = sizeof(myCompStr); cs_->dwCompReadAttrOffset = (DWORD)(UINT_PTR)&((myCompStr*)0)->compReadAttr; cs_->dwCompReadClauseOffset = (DWORD)(UINT_PTR)&((myCompStr*)0)->compReadClause; cs_->dwCompReadStrOffset = (DWORD)(UINT_PTR)&((myCompStr*)0)->compReadStr; cs_->dwCompAttrOffset = (DWORD)(UINT_PTR)&((myCompStr*)0)->compAttr; cs_->dwCompClauseOffset = (DWORD)(UINT_PTR)&((myCompStr*)0)->compClause; cs_->dwCompStrOffset = (DWORD)(UINT_PTR)&((myCompStr*)0)->compStr; cs_->dwResultReadClauseOffset = (DWORD)(UINT_PTR)&((myCompStr*)0)->resultReadClause; cs_->dwResultReadStrOffset = (DWORD)(UINT_PTR)&((myCompStr*)0)->resultReadStr; cs_->dwResultClauseOffset = (DWORD)(UINT_PTR)&((myCompStr*)0)->resultClause; cs_->dwResultStrOffset = (DWORD)(UINT_PTR)&((myCompStr*)0)->resultStr; ImmUnlockIMCC(handle); return true; }
BOOL IsCompStr(HIMC hIMC) { LPINPUTCONTEXT lpIMC; LPCOMPOSITIONSTRING lpCompStr; BOOL fRet = FALSE; if (!(lpIMC = ImmLockIMC(hIMC))) return FALSE; if (ImmGetIMCCSize(lpIMC->hCompStr) < sizeof (COMPOSITIONSTRING)) { ImmUnlockIMC(hIMC); return FALSE; } lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr); fRet = (lpCompStr->dwCompStrLen > 0); ImmUnlockIMCC(lpIMC->hCompStr); ImmUnlockIMC(hIMC); return fRet; }
BOOL IsCandidate(HIMC hIMC) { LPINPUTCONTEXT lpIMC; LPCANDIDATEINFO lpCandInfo; LPCANDIDATELIST lpCandList; BOOL fRet = FALSE; if (!(lpIMC = ImmLockIMC(hIMC))) return FALSE; if (ImmGetIMCCSize(lpIMC->hCandInfo) < sizeof (CANDIDATEINFO)){ ImmUnlockIMC(hIMC); return FALSE; } lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo); lpCandList = (LPCANDIDATELIST)((LPBYTE)lpCandInfo + lpCandInfo->dwOffset[0]); fRet = (lpCandList->dwCount > 0); ImmUnlockIMCC(lpIMC->hCandInfo); ImmUnlockIMC(hIMC); return fRet; }