From a167adfcb4571df39c3cbe4d7d758c5333553528 Mon Sep 17 00:00:00 2001 From: Dmitry Chapyshev Date: Tue, 27 Jan 2009 21:23:44 +0000 Subject: [PATCH] - Partially implement User32InitializeImmEntryTable svn path=/trunk/; revision=39150 --- reactos/dll/win32/user32/include/user32p.h | 1 + reactos/dll/win32/user32/misc/dllmain.c | 1 + reactos/dll/win32/user32/misc/imm.c | 65 +++++++++++++++++++++- 3 files changed, 64 insertions(+), 3 deletions(-) diff --git a/reactos/dll/win32/user32/include/user32p.h b/reactos/dll/win32/user32/include/user32p.h index aed656a0f16..2e4ad25d15b 100644 --- a/reactos/dll/win32/user32/include/user32p.h +++ b/reactos/dll/win32/user32/include/user32p.h @@ -131,6 +131,7 @@ /* Internal Thread Data */ extern HINSTANCE User32Instance; +extern HINSTANCE hImmInstance; /* Critical Section*/ extern RTL_CRITICAL_SECTION User32Crit; diff --git a/reactos/dll/win32/user32/misc/dllmain.c b/reactos/dll/win32/user32/misc/dllmain.c index 38c9c627ddc..8d7cc6d44f9 100644 --- a/reactos/dll/win32/user32/misc/dllmain.c +++ b/reactos/dll/win32/user32/misc/dllmain.c @@ -310,6 +310,7 @@ DllMain( break; case DLL_PROCESS_DETACH: + if (hImmInstance) FreeLibrary(hImmInstance); CleanupThread(); Cleanup(); break; diff --git a/reactos/dll/win32/user32/misc/imm.c b/reactos/dll/win32/user32/misc/imm.c index 0b22c5fada0..4d13624c479 100644 --- a/reactos/dll/win32/user32/misc/imm.c +++ b/reactos/dll/win32/user32/misc/imm.c @@ -12,16 +12,75 @@ #include - WINE_DEFAULT_DEBUG_CHANNEL(user32); + +typedef struct +{ + BOOL (WINAPI* pImmIsIME) (HKL); + HIMC (WINAPI* pImmAssociateContext) (HWND, HIMC); +} Imm32ApiTable; + +Imm32ApiTable *pImmApiTable = {0}; +HINSTANCE hImmInstance = NULL; + + +static BOOL IsInitialized() +{ + return (hImmInstance != NULL) ? TRUE : FALSE; +} + +/* + * This function should not be implemented, it is used, + * if you can not load function from imm32.dll + */ +BOOL WINAPI IMM_ImmIsIME(HKL hKL) +{ + return 0; +} + +/* See comment for IMM_ImmIsIME */ +HIMC WINAPI IMM_ImmAssociateContext(HWND hwnd, HIMC himc) +{ + return 0; +} + /* * @unimplemented */ -DWORD WINAPI User32InitializeImmEntryTable(PVOID p) +BOOL WINAPI User32InitializeImmEntryTable(DWORD dwUnknown) { UNIMPLEMENTED; - return 0; + + if (dwUnknown != 0x19650412) /* FIXME */ + return FALSE; + + if (IsInitialized()) + return TRUE; + + hImmInstance = LoadLibraryW(L"imm32.dll"); + if (!hImmInstance) + return FALSE; + + ZeroMemory(pImmApiTable, sizeof(Imm32ApiTable)); + + pImmApiTable->pImmIsIME = (BOOL (WINAPI*)(HKL)) GetProcAddress(hImmInstance, "ImmIsIME"); + if (!pImmApiTable->pImmIsIME) + pImmApiTable->pImmIsIME = IMM_ImmIsIME; + + pImmApiTable->pImmAssociateContext = (HIMC (WINAPI*)(HWND, HIMC)) GetProcAddress(hImmInstance, "ImmAssociateContext"); + if (!pImmApiTable->pImmAssociateContext) + pImmApiTable->pImmAssociateContext = IMM_ImmAssociateContext; + + /* + * TODO: Load more functions from imm32.dll + * Function like IMPSetIMEW, IMPQueryIMEW etc. call functions + * from imm32.dll through pointers in the structure pImmApiTable. + * I do not know whether it is necessary to initialize a table + * of functions to load user32 (DLL_PROCESS_ATTACH) + */ + + return TRUE; } /*