[IMM32] Add uCodePage parameter to Imm32WideFromAnsi/Imm32AnsiFromWide

This needs for multiple codepage support.
CORE-11700
This commit is contained in:
Katayama Hirofumi MZ 2022-10-21 16:04:59 +09:00
parent e1d3a7d08c
commit 6585803681
7 changed files with 70 additions and 52 deletions

View file

@ -153,17 +153,18 @@ static DWORD APIENTRY
ImmGetCandidateListAW(HIMC hIMC, DWORD dwIndex, LPCANDIDATELIST lpCandList, DWORD dwBufLen, ImmGetCandidateListAW(HIMC hIMC, DWORD dwIndex, LPCANDIDATELIST lpCandList, DWORD dwBufLen,
BOOL bAnsi) BOOL bAnsi)
{ {
DWORD ret = 0; DWORD dwSize, ret = 0;
UINT uCodePage;
LPINPUTCONTEXT pIC; LPINPUTCONTEXT pIC;
PCLIENTIMC pClientImc; PCLIENTIMC pClientImc;
LPCANDIDATEINFO pCI; LPCANDIDATEINFO pCI;
LPCANDIDATELIST pCL; LPCANDIDATELIST pCL;
DWORD dwSize;
pClientImc = ImmLockClientImc(hIMC); pClientImc = ImmLockClientImc(hIMC);
if (!pClientImc) if (!pClientImc)
return 0; return 0;
uCodePage = pClientImc->uCodePage;
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (pIC == NULL) if (pIC == NULL)
{ {
@ -187,7 +188,7 @@ ImmGetCandidateListAW(HIMC hIMC, DWORD dwIndex, LPCANDIDATELIST lpCandList, DWOR
if (bAnsi) if (bAnsi)
{ {
if (pClientImc->dwFlags & CLIENTIMC_WIDE) if (pClientImc->dwFlags & CLIENTIMC_WIDE)
dwSize = CandidateListAnsiToWide(pCL, NULL, 0, CP_ACP); dwSize = CandidateListAnsiToWide(pCL, NULL, 0, uCodePage);
else else
dwSize = pCL->dwSize; dwSize = pCL->dwSize;
} }
@ -196,7 +197,7 @@ ImmGetCandidateListAW(HIMC hIMC, DWORD dwIndex, LPCANDIDATELIST lpCandList, DWOR
if (pClientImc->dwFlags & CLIENTIMC_WIDE) if (pClientImc->dwFlags & CLIENTIMC_WIDE)
dwSize = pCL->dwSize; dwSize = pCL->dwSize;
else else
dwSize = CandidateListWideToAnsi(pCL, NULL, 0, CP_ACP); dwSize = CandidateListWideToAnsi(pCL, NULL, 0, uCodePage);
} }
if (dwBufLen != 0 && dwSize != 0) if (dwBufLen != 0 && dwSize != 0)
@ -208,7 +209,7 @@ ImmGetCandidateListAW(HIMC hIMC, DWORD dwIndex, LPCANDIDATELIST lpCandList, DWOR
if (bAnsi) if (bAnsi)
{ {
if (pClientImc->dwFlags & CLIENTIMC_WIDE) if (pClientImc->dwFlags & CLIENTIMC_WIDE)
CandidateListAnsiToWide(pCL, lpCandList, dwSize, CP_ACP); CandidateListAnsiToWide(pCL, lpCandList, dwSize, uCodePage);
else else
RtlCopyMemory(lpCandList, pCL, dwSize); RtlCopyMemory(lpCandList, pCL, dwSize);
} }
@ -217,7 +218,7 @@ ImmGetCandidateListAW(HIMC hIMC, DWORD dwIndex, LPCANDIDATELIST lpCandList, DWOR
if (pClientImc->dwFlags & CLIENTIMC_WIDE) if (pClientImc->dwFlags & CLIENTIMC_WIDE)
RtlCopyMemory(lpCandList, pCL, dwSize); RtlCopyMemory(lpCandList, pCL, dwSize);
else else
CandidateListWideToAnsi(pCL, lpCandList, dwSize, CP_ACP); CandidateListWideToAnsi(pCL, lpCandList, dwSize, uCodePage);
} }
} }
@ -227,6 +228,7 @@ Quit:
ImmUnlockIMCC(pIC->hCandInfo); ImmUnlockIMCC(pIC->hCandInfo);
ImmUnlockIMC(hIMC); ImmUnlockIMC(hIMC);
ImmUnlockClientImc(pClientImc); ImmUnlockClientImc(pClientImc);
TRACE("ret: 0x%X\n", ret);
return ret; return ret;
} }
@ -237,6 +239,7 @@ ImmGetCandidateListCountAW(HIMC hIMC, LPDWORD lpdwListCount, BOOL bAnsi)
DWORD ret = 0, cbGot, dwIndex; DWORD ret = 0, cbGot, dwIndex;
PCLIENTIMC pClientImc; PCLIENTIMC pClientImc;
LPINPUTCONTEXT pIC; LPINPUTCONTEXT pIC;
UINT uCodePage;
const CANDIDATEINFO *pCI; const CANDIDATEINFO *pCI;
const BYTE *pb; const BYTE *pb;
const CANDIDATELIST *pCL; const CANDIDATELIST *pCL;
@ -258,6 +261,8 @@ ImmGetCandidateListCountAW(HIMC hIMC, LPDWORD lpdwListCount, BOOL bAnsi)
return 0; return 0;
} }
uCodePage = pClientImc->uCodePage;
pCI = ImmLockIMCC(pIC->hCandInfo); pCI = ImmLockIMCC(pIC->hCandInfo);
if (pCI == NULL) if (pCI == NULL)
{ {
@ -282,7 +287,7 @@ ImmGetCandidateListCountAW(HIMC hIMC, LPDWORD lpdwListCount, BOOL bAnsi)
{ {
pb = (const BYTE *)pCI + pdwOffsets[dwIndex]; pb = (const BYTE *)pCI + pdwOffsets[dwIndex];
pCL = (const CANDIDATELIST *)pb; pCL = (const CANDIDATELIST *)pb;
cbGot = CandidateListWideToAnsi(pCL, NULL, 0, CP_ACP); cbGot = CandidateListWideToAnsi(pCL, NULL, 0, uCodePage);
ret += cbGot; ret += cbGot;
} }
} }
@ -305,7 +310,7 @@ ImmGetCandidateListCountAW(HIMC hIMC, LPDWORD lpdwListCount, BOOL bAnsi)
{ {
pb = (const BYTE *)pCI + pdwOffsets[dwIndex]; pb = (const BYTE *)pCI + pdwOffsets[dwIndex];
pCL = (const CANDIDATELIST *)pb; pCL = (const CANDIDATELIST *)pb;
cbGot = CandidateListAnsiToWide(pCL, NULL, 0, CP_ACP); cbGot = CandidateListAnsiToWide(pCL, NULL, 0, uCodePage);
ret += cbGot; ret += cbGot;
} }
} }
@ -315,6 +320,7 @@ Quit:
ImmUnlockIMCC(pIC->hCandInfo); ImmUnlockIMCC(pIC->hCandInfo);
ImmUnlockIMC(hIMC); ImmUnlockIMC(hIMC);
ImmUnlockClientImc(pClientImc); ImmUnlockClientImc(pClientImc);
TRACE("ret: 0x%X\n", ret);
return ret; return ret;
} }
@ -379,6 +385,7 @@ ImmGetCandidateWindow(HIMC hIMC, DWORD dwIndex, LPCANDIDATEFORM lpCandidate)
} }
ImmUnlockIMC(hIMC); ImmUnlockIMC(hIMC);
TRACE("ret: %d\n", ret);
return ret; return ret;
} }

View file

@ -841,6 +841,7 @@ Quit:
ImmLocalFree(pCompNew); ImmLocalFree(pCompNew);
ImmLocalFree(pReadNew); ImmLocalFree(pReadNew);
ImmUnlockImeDpi(pImeDpi); ImmUnlockImeDpi(pImeDpi);
TRACE("ret: %d\n", ret);
return ret; return ret;
} }
@ -883,6 +884,7 @@ LONG WINAPI ImmGetCompositionStringA(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWO
ret = Imm32GetCompStrA(hIMC, pCS, dwIndex, lpBuf, dwBufLen, bAnsiClient, uCodePage); ret = Imm32GetCompStrA(hIMC, pCS, dwIndex, lpBuf, dwBufLen, bAnsiClient, uCodePage);
ImmUnlockIMCC(pIC->hCompStr); ImmUnlockIMCC(pIC->hCompStr);
ImmUnlockIMC(hIMC); ImmUnlockIMC(hIMC);
TRACE("ret: %ld\n", ret);
return ret; return ret;
} }
@ -925,6 +927,7 @@ LONG WINAPI ImmGetCompositionStringW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWO
ret = Imm32GetCompStrW(hIMC, pCS, dwIndex, lpBuf, dwBufLen, bAnsiClient, uCodePage); ret = Imm32GetCompStrW(hIMC, pCS, dwIndex, lpBuf, dwBufLen, bAnsiClient, uCodePage);
ImmUnlockIMCC(pIC->hCompStr); ImmUnlockIMCC(pIC->hCompStr);
ImmUnlockIMC(hIMC); ImmUnlockIMC(hIMC);
TRACE("ret: %ld\n", ret);
return ret; return ret;
} }

View file

@ -19,11 +19,14 @@ ImmGetGuideLineAW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen, BOOL b
DWORD cb, ret = 0; DWORD cb, ret = 0;
LPVOID pvStr, pvPrivate; LPVOID pvStr, pvPrivate;
BOOL bUsedDefault; BOOL bUsedDefault;
UINT uCodePage;
pClientImc = ImmLockClientImc(hIMC); pClientImc = ImmLockClientImc(hIMC);
if (!pClientImc) if (!pClientImc)
return 0; return 0;
uCodePage = pClientImc->uCodePage;
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
if (!pIC) if (!pIC)
{ {
@ -60,7 +63,7 @@ ImmGetGuideLineAW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen, BOOL b
{ {
if (pClientImc->dwFlags & CLIENTIMC_WIDE) if (pClientImc->dwFlags & CLIENTIMC_WIDE)
{ {
cb = WideCharToMultiByte(CP_ACP, 0, pvStr, pGuideLine->dwStrLen, cb = WideCharToMultiByte(uCodePage, 0, pvStr, pGuideLine->dwStrLen,
NULL, 0, NULL, &bUsedDefault); NULL, 0, NULL, &bUsedDefault);
} }
else else
@ -76,7 +79,7 @@ ImmGetGuideLineAW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen, BOOL b
} }
else else
{ {
cb = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, pvStr, pGuideLine->dwStrLen, cb = MultiByteToWideChar(uCodePage, MB_PRECOMPOSED, pvStr, pGuideLine->dwStrLen,
NULL, 0) * sizeof(WCHAR); NULL, 0) * sizeof(WCHAR);
} }
} }
@ -92,7 +95,7 @@ ImmGetGuideLineAW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen, BOOL b
{ {
if (pClientImc->dwFlags & CLIENTIMC_WIDE) if (pClientImc->dwFlags & CLIENTIMC_WIDE)
{ {
ret = WideCharToMultiByte(CP_ACP, 0, pvStr, pGuideLine->dwStrLen, ret = WideCharToMultiByte(uCodePage, 0, pvStr, pGuideLine->dwStrLen,
lpBuf, dwBufLen, NULL, &bUsedDefault); lpBuf, dwBufLen, NULL, &bUsedDefault);
goto Quit; goto Quit;
} }
@ -101,7 +104,7 @@ ImmGetGuideLineAW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen, BOOL b
{ {
if (!(pClientImc->dwFlags & CLIENTIMC_WIDE)) if (!(pClientImc->dwFlags & CLIENTIMC_WIDE))
{ {
ret = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, pvStr, pGuideLine->dwStrLen, ret = MultiByteToWideChar(uCodePage, MB_PRECOMPOSED, pvStr, pGuideLine->dwStrLen,
lpBuf, dwBufLen) * sizeof(WCHAR); lpBuf, dwBufLen) * sizeof(WCHAR);
goto Quit; goto Quit;
} }
@ -122,7 +125,7 @@ ImmGetGuideLineAW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen, BOOL b
if ((pClientImc->dwFlags & CLIENTIMC_WIDE) && if ((pClientImc->dwFlags & CLIENTIMC_WIDE) &&
pGuideLine->dwIndex == GL_ID_REVERSECONVERSION) pGuideLine->dwIndex == GL_ID_REVERSECONVERSION)
{ {
cb = CandidateListWideToAnsi(pvPrivate, NULL, 0, CP_ACP); cb = CandidateListWideToAnsi(pvPrivate, NULL, 0, uCodePage);
} }
else else
{ {
@ -134,7 +137,7 @@ ImmGetGuideLineAW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen, BOOL b
if (!(pClientImc->dwFlags & CLIENTIMC_WIDE) && if (!(pClientImc->dwFlags & CLIENTIMC_WIDE) &&
pGuideLine->dwIndex == GL_ID_REVERSECONVERSION) pGuideLine->dwIndex == GL_ID_REVERSECONVERSION)
{ {
cb = CandidateListAnsiToWide(pvPrivate, NULL, 0, CP_ACP); cb = CandidateListAnsiToWide(pvPrivate, NULL, 0, uCodePage);
} }
else else
{ {
@ -154,7 +157,7 @@ ImmGetGuideLineAW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen, BOOL b
if ((pClientImc->dwFlags & CLIENTIMC_WIDE) && if ((pClientImc->dwFlags & CLIENTIMC_WIDE) &&
pGuideLine->dwIndex == GL_ID_REVERSECONVERSION) pGuideLine->dwIndex == GL_ID_REVERSECONVERSION)
{ {
ret = CandidateListWideToAnsi(pvPrivate, lpBuf, cb, CP_ACP); ret = CandidateListWideToAnsi(pvPrivate, lpBuf, cb, uCodePage);
goto Quit; goto Quit;
} }
} }
@ -163,7 +166,7 @@ ImmGetGuideLineAW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen, BOOL b
if (!(pClientImc->dwFlags & CLIENTIMC_WIDE) && if (!(pClientImc->dwFlags & CLIENTIMC_WIDE) &&
pGuideLine->dwIndex == GL_ID_REVERSECONVERSION) pGuideLine->dwIndex == GL_ID_REVERSECONVERSION)
{ {
ret = CandidateListAnsiToWide(pvPrivate, lpBuf, cb, CP_ACP); ret = CandidateListAnsiToWide(pvPrivate, lpBuf, cb, uCodePage);
goto Quit; goto Quit;
} }
} }
@ -177,6 +180,7 @@ Quit:
ImmUnlockIMCC(pIC->hGuideLine); ImmUnlockIMCC(pIC->hGuideLine);
ImmUnlockIMC(hIMC); ImmUnlockIMC(hIMC);
ImmUnlockClientImc(pClientImc); ImmUnlockClientImc(pClientImc);
TRACE("ret: 0x%X\n", ret);
return ret; return ret;
} }

View file

@ -655,13 +655,13 @@ ImmGetImeMenuItemsAW(HIMC hIMC, DWORD dwFlags, DWORD dwType, LPVOID lpImeParentM
if (bTargetIsAnsi) if (bTargetIsAnsi)
{ {
if (pNewParent) if (pNewParent)
Imm32ImeMenuWideToAnsi(pNewParent, lpImeParentMenu, CP_ACP); Imm32ImeMenuWideToAnsi(pNewParent, lpImeParentMenu, pImeDpi->uCodePage);
pItemW = pNewItems; pItemW = pNewItems;
pItemA = lpImeMenu; pItemA = lpImeMenu;
for (iItem = 0; iItem < ret; ++iItem, ++pItemW, ++pItemA) for (iItem = 0; iItem < ret; ++iItem, ++pItemW, ++pItemA)
{ {
if (!Imm32ImeMenuWideToAnsi(pItemW, pItemA, CP_ACP)) if (!Imm32ImeMenuWideToAnsi(pItemW, pItemA, pImeDpi->uCodePage))
{ {
ret = 0; ret = 0;
break; break;
@ -704,11 +704,11 @@ HKL WINAPI ImmInstallIMEA(LPCSTR lpszIMEFileName, LPCSTR lpszLayoutText)
TRACE("(%s, %s)\n", debugstr_a(lpszIMEFileName), debugstr_a(lpszLayoutText)); TRACE("(%s, %s)\n", debugstr_a(lpszIMEFileName), debugstr_a(lpszLayoutText));
pszFileNameW = Imm32WideFromAnsi(lpszIMEFileName); pszFileNameW = Imm32WideFromAnsi(CP_ACP, lpszIMEFileName);
if (!pszFileNameW) if (!pszFileNameW)
goto Quit; goto Quit;
pszLayoutTextW = Imm32WideFromAnsi(lpszLayoutText); pszLayoutTextW = Imm32WideFromAnsi(CP_ACP, lpszLayoutText);
if (!pszLayoutTextW) if (!pszLayoutTextW)
goto Quit; goto Quit;
@ -1712,7 +1712,7 @@ ImmGetConversionListA(HKL hKL, HIMC hIMC, LPCSTR pSrc, LPCANDIDATELIST lpDst,
if (pSrc) if (pSrc)
{ {
pszSrcW = Imm32WideFromAnsi(pSrc); pszSrcW = Imm32WideFromAnsi(pImeDpi->uCodePage, pSrc);
if (pszSrcW == NULL) if (pszSrcW == NULL)
goto Quit; goto Quit;
} }
@ -1729,7 +1729,7 @@ ImmGetConversionListA(HKL hKL, HIMC hIMC, LPCSTR pSrc, LPCANDIDATELIST lpDst,
if (cb == 0) if (cb == 0)
goto Quit; goto Quit;
ret = CandidateListWideToAnsi(pCL, lpDst, dwBufLen, CP_ACP); ret = CandidateListWideToAnsi(pCL, lpDst, dwBufLen, pImeDpi->uCodePage);
Quit: Quit:
ImmLocalFree(pszSrcW); ImmLocalFree(pszSrcW);
@ -1767,7 +1767,7 @@ ImmGetConversionListW(HKL hKL, HIMC hIMC, LPCWSTR pSrc, LPCANDIDATELIST lpDst,
if (pSrc) if (pSrc)
{ {
pszSrcA = Imm32AnsiFromWide(pSrc); pszSrcA = Imm32AnsiFromWide(pImeDpi->uCodePage, pSrc);
if (pszSrcA == NULL) if (pszSrcA == NULL)
goto Quit; goto Quit;
} }
@ -1784,7 +1784,7 @@ ImmGetConversionListW(HKL hKL, HIMC hIMC, LPCWSTR pSrc, LPCANDIDATELIST lpDst,
if (!cb) if (!cb)
goto Quit; goto Quit;
ret = CandidateListAnsiToWide(pCL, lpDst, dwBufLen, CP_ACP); ret = CandidateListAnsiToWide(pCL, lpDst, dwBufLen, pImeDpi->uCodePage);
Quit: Quit:
ImmLocalFree(pszSrcA); ImmLocalFree(pszSrcA);
@ -1902,14 +1902,14 @@ BOOL WINAPI ImmConfigureIMEA(HKL hKL, HWND hWnd, DWORD dwMode, LPVOID lpData)
if (pRegWordA->lpReading) if (pRegWordA->lpReading)
{ {
RegWordW.lpReading = Imm32WideFromAnsi(pRegWordA->lpReading); RegWordW.lpReading = Imm32WideFromAnsi(pImeDpi->uCodePage, pRegWordA->lpReading);
if (!RegWordW.lpReading) if (!RegWordW.lpReading)
goto Quit; goto Quit;
} }
if (pRegWordA->lpWord) if (pRegWordA->lpWord)
{ {
RegWordW.lpWord = Imm32WideFromAnsi(pRegWordA->lpWord); RegWordW.lpWord = Imm32WideFromAnsi(pImeDpi->uCodePage, pRegWordA->lpWord);
if (!RegWordW.lpWord) if (!RegWordW.lpWord)
goto Quit; goto Quit;
} }
@ -1956,14 +1956,14 @@ BOOL WINAPI ImmConfigureIMEW(HKL hKL, HWND hWnd, DWORD dwMode, LPVOID lpData)
if (pRegWordW->lpReading) if (pRegWordW->lpReading)
{ {
RegWordA.lpReading = Imm32AnsiFromWide(pRegWordW->lpReading); RegWordA.lpReading = Imm32AnsiFromWide(pImeDpi->uCodePage, pRegWordW->lpReading);
if (!RegWordA.lpReading) if (!RegWordA.lpReading)
goto Quit; goto Quit;
} }
if (pRegWordW->lpWord) if (pRegWordW->lpWord)
{ {
RegWordA.lpWord = Imm32AnsiFromWide(pRegWordW->lpWord); RegWordA.lpWord = Imm32AnsiFromWide(pImeDpi->uCodePage, pRegWordW->lpWord);
if (!RegWordA.lpWord) if (!RegWordA.lpWord)
goto Quit; goto Quit;
} }

View file

@ -88,8 +88,8 @@ BOOL APIENTRY Imm32CheckImcProcess(PIMC pIMC);
LPVOID APIENTRY ImmLocalAlloc(DWORD dwFlags, DWORD dwBytes); LPVOID APIENTRY ImmLocalAlloc(DWORD dwFlags, DWORD dwBytes);
#define ImmLocalFree(lpData) HeapFree(ghImmHeap, 0, (lpData)) #define ImmLocalFree(lpData) HeapFree(ghImmHeap, 0, (lpData))
LPWSTR APIENTRY Imm32WideFromAnsi(LPCSTR pszA); LPWSTR APIENTRY Imm32WideFromAnsi(UINT uCodePage, LPCSTR pszA);
LPSTR APIENTRY Imm32AnsiFromWide(LPCWSTR pszW); LPSTR APIENTRY Imm32AnsiFromWide(UINT uCodePage, LPCWSTR pszW);
LONG APIENTRY IchWideFromAnsi(LONG cchAnsi, LPCSTR pchAnsi, UINT uCodePage); LONG APIENTRY IchWideFromAnsi(LONG cchAnsi, LPCSTR pchAnsi, UINT uCodePage);
LONG APIENTRY IchAnsiFromWide(LONG cchWide, LPCWSTR pchWide, UINT uCodePage); LONG APIENTRY IchAnsiFromWide(LONG cchWide, LPCWSTR pchWide, UINT uCodePage);
PIMEDPI APIENTRY Imm32FindOrLoadImeDpi(HKL hKL); PIMEDPI APIENTRY Imm32FindOrLoadImeDpi(HKL hKL);

View file

@ -14,6 +14,7 @@ typedef struct ENUM_WORD_A2W
REGISTERWORDENUMPROCW lpfnEnumProc; REGISTERWORDENUMPROCW lpfnEnumProc;
LPVOID lpData; LPVOID lpData;
UINT ret; UINT ret;
UINT uCodePage;
} ENUM_WORD_A2W, *LPENUM_WORD_A2W; } ENUM_WORD_A2W, *LPENUM_WORD_A2W;
typedef struct ENUM_WORD_W2A typedef struct ENUM_WORD_W2A
@ -21,6 +22,7 @@ typedef struct ENUM_WORD_W2A
REGISTERWORDENUMPROCA lpfnEnumProc; REGISTERWORDENUMPROCA lpfnEnumProc;
LPVOID lpData; LPVOID lpData;
UINT ret; UINT ret;
UINT uCodePage;
} ENUM_WORD_W2A, *LPENUM_WORD_W2A; } ENUM_WORD_W2A, *LPENUM_WORD_W2A;
/* /*
@ -35,14 +37,14 @@ Imm32EnumWordProcA2W(LPCSTR pszReadingA, DWORD dwStyle, LPCSTR pszRegisterA, LPV
if (pszReadingA) if (pszReadingA)
{ {
pszReadingW = Imm32WideFromAnsi(pszReadingA); pszReadingW = Imm32WideFromAnsi(lpEnumData->uCodePage, pszReadingA);
if (pszReadingW == NULL) if (pszReadingW == NULL)
goto Quit; goto Quit;
} }
if (pszRegisterA) if (pszRegisterA)
{ {
pszRegisterW = Imm32WideFromAnsi(pszRegisterA); pszRegisterW = Imm32WideFromAnsi(lpEnumData->uCodePage, pszRegisterA);
if (pszRegisterW == NULL) if (pszRegisterW == NULL)
goto Quit; goto Quit;
} }
@ -65,14 +67,14 @@ Imm32EnumWordProcW2A(LPCWSTR pszReadingW, DWORD dwStyle, LPCWSTR pszRegisterW, L
if (pszReadingW) if (pszReadingW)
{ {
pszReadingA = Imm32AnsiFromWide(pszReadingW); pszReadingA = Imm32AnsiFromWide(lpEnumData->uCodePage, pszReadingW);
if (pszReadingW == NULL) if (pszReadingW == NULL)
goto Quit; goto Quit;
} }
if (pszRegisterW) if (pszRegisterW)
{ {
pszRegisterA = Imm32AnsiFromWide(pszRegisterW); pszRegisterA = Imm32AnsiFromWide(lpEnumData->uCodePage, pszRegisterW);
if (pszRegisterA == NULL) if (pszRegisterA == NULL)
goto Quit; goto Quit;
} }
@ -116,14 +118,14 @@ ImmEnumRegisterWordA(HKL hKL, REGISTERWORDENUMPROCA lpfnEnumProc,
if (lpszReading) if (lpszReading)
{ {
pszReadingW = Imm32WideFromAnsi(lpszReading); pszReadingW = Imm32WideFromAnsi(pImeDpi->uCodePage, lpszReading);
if (pszReadingW == NULL) if (pszReadingW == NULL)
goto Quit; goto Quit;
} }
if (lpszRegister) if (lpszRegister)
{ {
pszRegisterW = Imm32WideFromAnsi(lpszRegister); pszRegisterW = Imm32WideFromAnsi(pImeDpi->uCodePage, lpszRegister);
if (pszRegisterW == NULL) if (pszRegisterW == NULL)
goto Quit; goto Quit;
} }
@ -131,6 +133,7 @@ ImmEnumRegisterWordA(HKL hKL, REGISTERWORDENUMPROCA lpfnEnumProc,
EnumDataW2A.lpfnEnumProc = lpfnEnumProc; EnumDataW2A.lpfnEnumProc = lpfnEnumProc;
EnumDataW2A.lpData = lpData; EnumDataW2A.lpData = lpData;
EnumDataW2A.ret = 0; EnumDataW2A.ret = 0;
EnumDataW2A.uCodePage = pImeDpi->uCodePage;
pImeDpi->ImeEnumRegisterWord(Imm32EnumWordProcW2A, pszReadingW, dwStyle, pImeDpi->ImeEnumRegisterWord(Imm32EnumWordProcW2A, pszReadingW, dwStyle,
pszRegisterW, &EnumDataW2A); pszRegisterW, &EnumDataW2A);
ret = EnumDataW2A.ret; ret = EnumDataW2A.ret;
@ -172,14 +175,14 @@ ImmEnumRegisterWordW(HKL hKL, REGISTERWORDENUMPROCW lpfnEnumProc,
if (lpszReading) if (lpszReading)
{ {
pszReadingA = Imm32AnsiFromWide(lpszReading); pszReadingA = Imm32AnsiFromWide(pImeDpi->uCodePage, lpszReading);
if (pszReadingA == NULL) if (pszReadingA == NULL)
goto Quit; goto Quit;
} }
if (lpszRegister) if (lpszRegister)
{ {
pszRegisterA = Imm32AnsiFromWide(lpszRegister); pszRegisterA = Imm32AnsiFromWide(pImeDpi->uCodePage, lpszRegister);
if (pszRegisterA == NULL) if (pszRegisterA == NULL)
goto Quit; goto Quit;
} }
@ -187,6 +190,7 @@ ImmEnumRegisterWordW(HKL hKL, REGISTERWORDENUMPROCW lpfnEnumProc,
EnumDataA2W.lpfnEnumProc = lpfnEnumProc; EnumDataA2W.lpfnEnumProc = lpfnEnumProc;
EnumDataA2W.lpData = lpData; EnumDataA2W.lpData = lpData;
EnumDataA2W.ret = 0; EnumDataA2W.ret = 0;
EnumDataA2W.uCodePage = pImeDpi->uCodePage;
pImeDpi->ImeEnumRegisterWord(Imm32EnumWordProcA2W, pszReadingA, dwStyle, pImeDpi->ImeEnumRegisterWord(Imm32EnumWordProcA2W, pszReadingA, dwStyle,
pszRegisterA, &EnumDataA2W); pszRegisterA, &EnumDataA2W);
ret = EnumDataA2W.ret; ret = EnumDataA2W.ret;
@ -240,7 +244,7 @@ UINT WINAPI ImmGetRegisterWordStyleA(HKL hKL, UINT nItem, LPSTYLEBUFA lpStyleBuf
pDestA = &lpStyleBuf[iItem]; pDestA = &lpStyleBuf[iItem];
pDestA->dwStyle = pSrcW->dwStyle; pDestA->dwStyle = pSrcW->dwStyle;
StringCchLengthW(pSrcW->szDescription, _countof(pSrcW->szDescription), &cchW); StringCchLengthW(pSrcW->szDescription, _countof(pSrcW->szDescription), &cchW);
cchA = WideCharToMultiByte(CP_ACP, MB_PRECOMPOSED, cchA = WideCharToMultiByte(pImeDpi->uCodePage, MB_PRECOMPOSED,
pSrcW->szDescription, (INT)cchW, pSrcW->szDescription, (INT)cchW,
pDestA->szDescription, _countof(pDestA->szDescription), pDestA->szDescription, _countof(pDestA->szDescription),
NULL, NULL); NULL, NULL);
@ -298,7 +302,7 @@ UINT WINAPI ImmGetRegisterWordStyleW(HKL hKL, UINT nItem, LPSTYLEBUFW lpStyleBuf
pDestW = &lpStyleBuf[iItem]; pDestW = &lpStyleBuf[iItem];
pDestW->dwStyle = pSrcA->dwStyle; pDestW->dwStyle = pSrcA->dwStyle;
StringCchLengthA(pSrcA->szDescription, _countof(pSrcA->szDescription), &cchA); StringCchLengthA(pSrcA->szDescription, _countof(pSrcA->szDescription), &cchA);
cchW = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, cchW = MultiByteToWideChar(pImeDpi->uCodePage, MB_PRECOMPOSED,
pSrcA->szDescription, (INT)cchA, pSrcA->szDescription, (INT)cchA,
pDestW->szDescription, _countof(pDestW->szDescription)); pDestW->szDescription, _countof(pDestW->szDescription));
if (cchW > _countof(pDestW->szDescription) - 1) if (cchW > _countof(pDestW->szDescription) - 1)
@ -339,14 +343,14 @@ ImmRegisterWordA(HKL hKL, LPCSTR lpszReading, DWORD dwStyle, LPCSTR lpszRegister
if (lpszReading) if (lpszReading)
{ {
pszReadingW = Imm32WideFromAnsi(lpszReading); pszReadingW = Imm32WideFromAnsi(pImeDpi->uCodePage, lpszReading);
if (pszReadingW == NULL) if (pszReadingW == NULL)
goto Quit; goto Quit;
} }
if (lpszRegister) if (lpszRegister)
{ {
pszRegisterW = Imm32WideFromAnsi(lpszRegister); pszRegisterW = Imm32WideFromAnsi(pImeDpi->uCodePage, lpszRegister);
if (pszRegisterW == NULL) if (pszRegisterW == NULL)
goto Quit; goto Quit;
} }
@ -386,14 +390,14 @@ ImmRegisterWordW(HKL hKL, LPCWSTR lpszReading, DWORD dwStyle, LPCWSTR lpszRegist
if (lpszReading) if (lpszReading)
{ {
pszReadingA = Imm32AnsiFromWide(lpszReading); pszReadingA = Imm32AnsiFromWide(pImeDpi->uCodePage, lpszReading);
if (!pszReadingA) if (!pszReadingA)
goto Quit; goto Quit;
} }
if (lpszRegister) if (lpszRegister)
{ {
pszRegisterA = Imm32AnsiFromWide(lpszRegister); pszRegisterA = Imm32AnsiFromWide(pImeDpi->uCodePage, lpszRegister);
if (!pszRegisterA) if (!pszRegisterA)
goto Quit; goto Quit;
} }
@ -433,14 +437,14 @@ ImmUnregisterWordA(HKL hKL, LPCSTR lpszReading, DWORD dwStyle, LPCSTR lpszUnregi
if (lpszReading) if (lpszReading)
{ {
pszReadingW = Imm32WideFromAnsi(lpszReading); pszReadingW = Imm32WideFromAnsi(pImeDpi->uCodePage, lpszReading);
if (pszReadingW == NULL) if (pszReadingW == NULL)
goto Quit; goto Quit;
} }
if (lpszUnregister) if (lpszUnregister)
{ {
pszUnregisterW = Imm32WideFromAnsi(lpszUnregister); pszUnregisterW = Imm32WideFromAnsi(pImeDpi->uCodePage, lpszUnregister);
if (pszUnregisterW == NULL) if (pszUnregisterW == NULL)
goto Quit; goto Quit;
} }
@ -480,14 +484,14 @@ ImmUnregisterWordW(HKL hKL, LPCWSTR lpszReading, DWORD dwStyle, LPCWSTR lpszUnre
if (lpszReading) if (lpszReading)
{ {
pszReadingA = Imm32AnsiFromWide(lpszReading); pszReadingA = Imm32AnsiFromWide(pImeDpi->uCodePage, lpszReading);
if (!pszReadingA) if (!pszReadingA)
goto Quit; goto Quit;
} }
if (lpszUnregister) if (lpszUnregister)
{ {
pszUnregisterA = Imm32AnsiFromWide(lpszUnregister); pszUnregisterA = Imm32AnsiFromWide(pImeDpi->uCodePage, lpszUnregister);
if (!pszUnregisterA) if (!pszUnregisterA)
goto Quit; goto Quit;
} }

View file

@ -184,25 +184,25 @@ BOOL WINAPI Imm32IsImcAnsi(HIMC hIMC)
return ret; return ret;
} }
LPWSTR APIENTRY Imm32WideFromAnsi(LPCSTR pszA) LPWSTR APIENTRY Imm32WideFromAnsi(UINT uCodePage, LPCSTR pszA)
{ {
INT cch = lstrlenA(pszA); INT cch = lstrlenA(pszA);
LPWSTR pszW = ImmLocalAlloc(0, (cch + 1) * sizeof(WCHAR)); LPWSTR pszW = ImmLocalAlloc(0, (cch + 1) * sizeof(WCHAR));
if (pszW == NULL) if (pszW == NULL)
return NULL; return NULL;
cch = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, pszA, cch, pszW, cch + 1); cch = MultiByteToWideChar(uCodePage, MB_PRECOMPOSED, pszA, cch, pszW, cch + 1);
pszW[cch] = 0; pszW[cch] = 0;
return pszW; return pszW;
} }
LPSTR APIENTRY Imm32AnsiFromWide(LPCWSTR pszW) LPSTR APIENTRY Imm32AnsiFromWide(UINT uCodePage, LPCWSTR pszW)
{ {
INT cchW = lstrlenW(pszW); INT cchW = lstrlenW(pszW);
INT cchA = (cchW + 1) * sizeof(WCHAR); INT cchA = (cchW + 1) * sizeof(WCHAR);
LPSTR pszA = ImmLocalAlloc(0, cchA); LPSTR pszA = ImmLocalAlloc(0, cchA);
if (!pszA) if (!pszA)
return NULL; return NULL;
cchA = WideCharToMultiByte(CP_ACP, 0, pszW, cchW, pszA, cchA, NULL, NULL); cchA = WideCharToMultiByte(uCodePage, 0, pszW, cchW, pszA, cchA, NULL, NULL);
pszA[cchA] = 0; pszA[cchA] = 0;
return pszA; return pszA;
} }