2 * The entry point of IMM32.DLL.
4 * Copyright 2000 Hidenori Takeshima
16 #include "debugtools.h"
17 DEFAULT_DEBUG_CHANNEL(imm);
19 #include "imm_private.h"
21 static DWORD IMM32_dwProcessAttached = 0;
22 static HANDLE IMM32_hHeap;
23 static DWORD IMM32_dwTLSIndex;
24 static CRITICAL_SECTION IMM32_csIMM;
26 static BOOL IMM32_InitProcessMem( void );
27 static void IMM32_CleanupProcessMem( void );
28 static void IMM32_InitThreadData( void );
29 static void IMM32_CleanupThreadData( void );
32 /***********************************************************************
35 BOOL WINAPI IMM32_DllMain(
42 case DLL_PROCESS_ATTACH:
43 if ( IMM32_dwProcessAttached > 0 )
45 ERR( "cannot attach to two or more processes.\n" );
48 IMM32_dwProcessAttached ++;
50 IMM32_InitProcessMem();
51 IMM32_RegisterIMEWndClass( hInstDLL );
53 case DLL_PROCESS_DETACH:
54 /*IMM32_UnloadAllIMEs();*/
55 IMM32_UnregisterIMEWndClass( hInstDLL );
56 IMM32_CleanupProcessMem();
58 IMM32_dwProcessAttached --;
60 case DLL_THREAD_ATTACH:
61 IMM32_InitThreadData();
63 case DLL_THREAD_DETACH:
64 IMM32_CleanupThreadData();
71 static BOOL IMM32_InitProcessMem( void )
73 IMM32_hHeap = (HANDLE)NULL;
74 IMM32_dwTLSIndex = (DWORD)0xffffffff;
76 IMM32_hHeap = HeapCreate( 0, 0x10000, 0 );
77 if ( IMM32_hHeap == (HANDLE)NULL )
79 ERR( "cannot allocate heap for IMM32.\n" );
83 IMM32_dwTLSIndex = TlsAlloc();
84 if ( IMM32_dwTLSIndex == (DWORD)0xffffffff )
86 ERR( "cannot allocate a TLS for IMM.\n" );
90 InitializeCriticalSection( &IMM32_csIMM );
95 static void IMM32_CleanupProcessMem( void )
97 DeleteCriticalSection( &IMM32_csIMM );
99 if ( IMM32_dwTLSIndex != (DWORD)0xffffffff )
101 TlsFree( IMM32_dwTLSIndex );
102 IMM32_dwTLSIndex = (DWORD)0xffffffff;
105 if ( IMM32_hHeap != (HANDLE)NULL )
107 (void)HeapDestroy( IMM32_hHeap );
108 IMM32_hHeap = (HANDLE)NULL;
112 LPVOID IMM32_HeapAlloc( DWORD dwFlags, DWORD dwSize )
114 return HeapAlloc( IMM32_hHeap, dwFlags, dwSize );
117 LPVOID IMM32_HeapReAlloc( DWORD dwFlags, LPVOID lpv, DWORD dwSize )
119 return HeapReAlloc( IMM32_hHeap, dwFlags, lpv, dwSize );
122 void IMM32_HeapFree( LPVOID lpv )
125 HeapFree( IMM32_hHeap, 0, lpv );
129 static void IMM32_InitThreadData( void )
131 TlsSetValue( IMM32_dwTLSIndex, NULL );
134 static void IMM32_CleanupThreadData( void )
136 IMM32_THREADDATA* pData;
138 pData = (IMM32_THREADDATA*)TlsGetValue( IMM32_dwTLSIndex );
141 /* Destroy Thread-local Data. */
142 if ( pData->hwndIME != (HWND)NULL )
143 DestroyWindow( pData->hwndIME );
144 if ( pData->hIMC != NULLIMC )
145 ImmDestroyContext( pData->hIMC );
147 IMM32_HeapFree( pData );
148 TlsSetValue( IMM32_dwTLSIndex, NULL );
152 IMM32_THREADDATA* IMM32_GetThreadData( void )
154 IMM32_THREADDATA* pData;
156 pData = (IMM32_THREADDATA*)TlsGetValue( IMM32_dwTLSIndex );
160 pData = (IMM32_THREADDATA*)
161 IMM32_HeapAlloc( 0, sizeof(IMM32_THREADDATA) );
165 /* Initialize Thread-local Data. */
166 pData->hwndIME = (HWND)NULL;
167 pData->hIMC = NULLIMC;
169 TlsSetValue( IMM32_dwTLSIndex, pData );