[ttssh2-commit] [9382] ttime.cでdllutilを使ってAPIのロードを行うようにした

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2021年 8月 29日 (日) 00:29:03 JST


Revision: 9382
          https://osdn.net/projects/ttssh2/scm/svn/commits/9382
Author:   zmatsuo
Date:     2021-08-29 00:29:03 +0900 (Sun, 29 Aug 2021)
Log Message:
-----------
ttime.cでdllutilを使ってAPIのロードを行うようにした

- 警告対策
  - warning: cast between incompatible function types from 'FARPROC' ... [-Wcast-function-type] 等
- dllutil.cpp
  - DLLGetApiAddressFromList() dllハンドルを戻せるようにした
  - DLLFreeByFileName() 追加
  - DLLFreeByHandle() 追加

Modified Paths:
--------------
    trunk/teraterm/common/dllutil.cpp
    trunk/teraterm/common/dllutil.h
    trunk/teraterm/teraterm/ttime.c

-------------- next part --------------
Modified: trunk/teraterm/common/dllutil.cpp
===================================================================
--- trunk/teraterm/common/dllutil.cpp	2021-08-28 15:28:48 UTC (rev 9381)
+++ trunk/teraterm/common/dllutil.cpp	2021-08-28 15:29:03 UTC (rev 9382)
@@ -36,7 +36,7 @@
 #include "dllutil.h"
 
 typedef struct {
-	const wchar_t *dllName;
+	const wchar_t *fname;
 	DLLLoadFlag LoadFlag;
 	HMODULE handle;
 	int refCount;
@@ -45,7 +45,7 @@
 static HandleList_t *HandleList;
 static int HandleListCount;
 
-static HMODULE GetHandle(const wchar_t *dllName, DLLLoadFlag LoadFlag)
+static HMODULE GetHandle(const wchar_t *fname, DLLLoadFlag LoadFlag)
 {
 	wchar_t dllPath[MAX_PATH];
 	HMODULE module;
@@ -54,7 +54,7 @@
 	int r;
 
 	if (LoadFlag == DLL_GET_MODULE_HANDLE) {
-		module = GetModuleHandleW(dllName);
+		module = GetModuleHandleW(fname);
 		assert(module != NULL);
 		return module;
 	}
@@ -62,7 +62,7 @@
 	// \x88ȑO\x82Ƀ\x8D\x81[\x83h\x82\xB5\x82\xBD?
 	p = HandleList;
 	for (i = 0; i < HandleListCount; i++) {
-		if (wcscmp(p->dllName, dllName) == 0) {
+		if (wcscmp(p->fname, fname) == 0) {
 			p->refCount++;
 			return p->handle;
 		}
@@ -87,7 +87,7 @@
 		return NULL;
 	}
 	wcscat_s(dllPath, _countof(dllPath), L"\\");
-	wcscat_s(dllPath, _countof(dllPath), dllName);
+	wcscat_s(dllPath, _countof(dllPath), fname);
 	module = LoadLibraryW(dllPath);
 	if (module == NULL) {
 		// \x91\xB6\x8D݂\xB5\x82Ȃ\xA2,dll\x82\xB6\x82\xE1\x82Ȃ\xA2?
@@ -98,7 +98,7 @@
 	HandleListCount++;
 	HandleList = (HandleList_t *)realloc(HandleList, sizeof(HandleList_t)*HandleListCount);
 	p = &HandleList[i];
-	p->dllName = _wcsdup(dllName);
+	p->fname = _wcsdup(fname);
 	p->handle = module;
 	p->LoadFlag = LoadFlag;
 	p->refCount = 1;
@@ -105,55 +105,88 @@
 	return module;
 }
 
-static void FreeHandle(const wchar_t *dllName, DLLLoadFlag LoadFlag)
+static void DLLFree(HandleList_t *p)
 {
-	int i;
-	HandleList_t *p;
+	if (p->LoadFlag != DLL_GET_MODULE_HANDLE) {
+		FreeLibrary(p->handle);
+	}
+	free((void *)p->fname);
+}
 
-	if (LoadFlag == DLL_GET_MODULE_HANDLE) {
-		// \x82\xBB\x82̂܂ܒu\x82\xA2\x82Ă\xA8\x82\xAD
+static void DLLFreeFromList(int no)
+{
+	HandleList_t *p = &HandleList[no];
+	p->refCount--;
+	if (p->refCount > 0) {
 		return;
 	}
 
-	// \x83\x8A\x83X\x83g\x82\xA9\x82\xE7\x8D폜\x82\xB7\x82\xE9
-	p = HandleList;
-	for (i = 0; i < HandleListCount; i++) {
-		if (wcscmp(p->dllName, dllName) != 0) {
-			continue;
+	// \x8AJ\x95\xFA\x82\xB7\x82\xE9
+	DLLFree(p);
+	memcpy(p, p+1, sizeof(*p) + (HandleListCount - no - 1));
+	HandleListCount--;
+	HandleList = (HandleList_t *)realloc(HandleList, sizeof(HandleList_t)*HandleListCount);
+}
+
+/**
+ *	dll\x82\xF0\x83A\x83\x93\x83\x8D\x81[\x83h\x82\xB7\x82\xE9
+ *
+ *	@param[in]	handle
+ */
+void DLLFreeByHandle(HANDLE handle)
+{
+	// \x83\x8A\x83X\x83g\x82\xA9\x82\xE7\x92T\x82\xB7
+	HandleList_t *p = HandleList;
+	for (int i = 0; i < HandleListCount; i++) {
+		if (p->handle == handle) {
+			// \x8C\xA9\x82‚\xA9\x82\xC1\x82\xBD\x81A\x8D폜
+			DLLFreeFromList(i);
+			return;
 		}
+		p++;
+	}
 
-		// \x8C\xA9\x82‚\xA9\x82\xC1\x82\xBD
-		p->refCount--;
-		if (p->refCount > 0) {
-			continue;
+	// \x83\x8A\x83X\x83g\x82ɂȂ\xA9\x82\xC1\x82\xBD
+}
+
+/**
+ *	dll\x82\xF0\x83A\x83\x93\x83\x8D\x81[\x83h\x82\xB7\x82\xE9
+ *
+ *	@param[in]	fname	\x83t\x83@\x83C\x83\x8B\x96\xBC
+ */
+void DLLFreeByFileName(const wchar_t *fname)
+{
+	// \x83\x8A\x83X\x83g\x82\xA9\x82\xE7\x92T\x82\xB7
+	HandleList_t *p = HandleList;
+	for (int i = 0; i < HandleListCount; i++) {
+		if (wcscmp(p->fname, fname) == 0) {
+			// \x8C\xA9\x82‚\xA9\x82\xC1\x82\xBD\x81A\x8D폜
+			DLLFreeFromList(i);
+			return;
 		}
+		p++;
+	}
 
-		// free
-		FreeLibrary(p->handle);
-		free((void *)p->dllName);
-		memcpy(p, p+1, sizeof(*p) + (HandleListCount - i - 1));
-		HandleListCount--;
-		HandleList = (HandleList_t *)realloc(HandleList, sizeof(HandleList_t)*HandleListCount);
-		return;
-	}
-	// \x83\x8A\x83X\x83g\x82Ɍ\xA9\x82‚\xA9\x82\xE7\x82Ȃ\xA9\x82\xC1\x82\xBD
+	// \x83\x8A\x83X\x83g\x82ɂȂ\xA9\x82\xC1\x82\xBD
 }
 
 /**
  * DLL\x93\xE0\x82̊֐\x94\x82ւ̃A\x83h\x83\x8C\x83X\x82\xF0\x8E擾\x82\xB7\x82\xE9
- * @param[in,out]	pFunc		\x8A֐\x94\x82ւ̃A\x83h\x83\x8C\x83X
- *								\x8C\xA9\x82‚\xA9\x82\xE7\x82Ȃ\xA2\x8E\x9E\x82\xCDNULL\x82\xAA\x91\xE3\x93\xFC\x82\xB3\x82\xEA\x82\xE9
+ * @param[in]		fname		DLL\x83t\x83@\x83C\x83\x8B\x96\xBC
  * @param[in] 		FuncFlag	\x8A֐\x94\x82\xAA\x8C\xA9\x82‚\xA9\x82\xE7\x82Ȃ\xA2\x82Ƃ\xAB\x82̓\xAE\x8D\xEC
  *					DLL_ACCEPT_NOT_EXIST	\x8C\xA9\x82‚\xA9\x82\xE7\x82Ȃ\xAD\x82Ă\xE0ok
  *					DLL_ERROR_NOT_EXIST		\x8C\xA9\x82‚\xA9\x82\xE7\x82Ȃ\xA2\x8Fꍇ\x83G\x83\x89\x81[
+ * @param[in]		ApiName		API\x96\xBC
+ * @param[in,out]	pFunc		\x8A֐\x94\x82ւ̃A\x83h\x83\x8C\x83X
+ *								\x8C\xA9\x82‚\xA9\x82\xE7\x82Ȃ\xA2\x8E\x9E\x82\xCDNULL\x82\xAA\x91\xE3\x93\xFC\x82\xB3\x82\xEA\x82\xE9
  * @retval	NO_ERROR				\x83G\x83\x89\x81[\x82Ȃ\xB5
  * @retval	ERROR_FILE_NOT_FOUND	DLL\x82\xAA\x8C\xA9\x82‚\xA9\x82\xE7\x82Ȃ\xA2(\x95s\x90\xB3\x82ȃt\x83@\x83C\x83\x8B)
  * @retval	ERROR_PROC_NOT_FOUND	\x8A֐\x94\x83G\x83\x93\x83g\x83\x8A\x82\xAA\x8C\xA9\x82‚\xA9\x82\xE7\x82Ȃ\xA2
  */
-DWORD DLLGetApiAddress(const wchar_t *dllPath, DLLLoadFlag LoadFlag,
+DWORD DLLGetApiAddress(const wchar_t *fname, DLLLoadFlag LoadFlag,
 					   const char *ApiName, void **pFunc)
 {
-	HMODULE hDll = GetHandle(dllPath, LoadFlag);
+	HMODULE hDll = GetHandle(fname, LoadFlag);
 	if (hDll == NULL) {
 		*pFunc = NULL;
 		return ERROR_FILE_NOT_FOUND;
@@ -168,17 +201,22 @@
 
 /**
  * DLL\x93\xE0\x82̕\xA1\x90\x94\x82̊֐\x94\x82ւ̃A\x83h\x83\x8C\x83X\x82\xF0\x8E擾\x82\xB7\x82\xE9
+ * @param[in] fname		dll\x82̃t\x83@\x83C\x83\x8B\x96\xBC
+ * @param[in] LoadFlag	dll\x82̃\x8D\x81[\x83h\x90\xE6
+ *				DLL_GET_MODULE_HANDLE,
+ *				DLL_LOAD_LIBRARY_SYSTEM,
+ *				DLL_LOAD_LIBRARY_CURRENT,
  * @param[in] FuncFlag	\x8A֐\x94\x82\xAA\x8C\xA9\x82‚\xA9\x82\xE7\x82Ȃ\xA2\x82Ƃ\xAB\x82̓\xAE\x8D\xEC
- *				DLL_ACCEPT_NOT_EXIST	\x8C\xA9\x82‚\xA9\x82\xE7\x82Ȃ\xAD\x82Ă\xE0ok
- *				DLL_ERROR_NOT_EXIST		\x8C\xA9\x82‚\xA9\x82\xE7\x82Ȃ\xA2\x8Fꍇ\x83G\x83\x89\x81[
+ * @param[out] handle	DLL\x83n\x83\x93\x83h\x83\x8B
+ *				NULL\x82̂Ƃ\xAB\x82͒l\x82\xF0\x95Ԃ\xB3\x82Ȃ\xA2
  * @retval	NO_ERROR				\x83G\x83\x89\x81[\x82Ȃ\xB5
  * @retval	ERROR_FILE_NOT_FOUND	DLL\x82\xAA\x8C\xA9\x82‚\xA9\x82\xE7\x82Ȃ\xA2(\x95s\x90\xB3\x82ȃt\x83@\x83C\x83\x8B)
  * @retval	ERROR_PROC_NOT_FOUND	\x8A֐\x94\x83G\x83\x93\x83g\x83\x8A\x82\xAA\x8C\xA9\x82‚\xA9\x82\xE7\x82Ȃ\xA2
  */
-DWORD DLLGetApiAddressFromList(const wchar_t *dllPath, DLLLoadFlag LoadFlag,
-							   DLLFuncFlag FuncFlag, const APIInfo *ApiInfo)
+DWORD DLLGetApiAddressFromList(const wchar_t *fname, DLLLoadFlag LoadFlag,
+							   DLLFuncFlag FuncFlag, const APIInfo *ApiInfo, HANDLE *handle)
 {
-	HMODULE hDll = GetHandle(dllPath, LoadFlag);
+	HMODULE hDll = GetHandle(fname, LoadFlag);
 	if (hDll == NULL) {
 		while(ApiInfo->ApiName != NULL) {
 			void **func = ApiInfo->func;
@@ -185,6 +223,9 @@
 			*func = NULL;
 			ApiInfo++;
 		}
+		if (handle != NULL) {
+			*handle = NULL;
+		}
 		return ERROR_FILE_NOT_FOUND;
 	} else {
 		BOOL exist_all = TRUE;
@@ -202,6 +243,9 @@
 
 		// \x82\xB7\x82ׂČ\xA9\x82‚\xA9\x82\xC1\x82\xBD or \x8C\xA9\x82‚\xA9\x82\xE7\x82Ȃ\xA2API\x82\xAA\x82\xA0\x82\xC1\x82Ă\xE0ok
 		if (exist_all || FuncFlag == DLL_ACCEPT_NOT_EXIST) {
+			if (handle != NULL) {
+				*handle = hDll;
+			}
 			return NO_ERROR;
 		}
 
@@ -212,7 +256,10 @@
 			*func = NULL;
 			p++;
 		}
-		FreeHandle(dllPath, LoadFlag);
+		DLLFreeByFileName(fname);
+		if (handle != NULL) {
+			*handle = NULL;
+		}
 		return ERROR_PROC_NOT_FOUND;
 	}
 }
@@ -223,7 +270,7 @@
 		DLLGetApiAddressFromList(dllInfos->DllName,
 								 dllInfos->LoadFlag,
 								 dllInfos->FuncFlag,
-								 dllInfos->APIInfoPtr);
+								 dllInfos->APIInfoPtr, NULL);
 		dllInfos++;
 	}
 }
@@ -276,10 +323,7 @@
 	}
 	for (i = 0; i < HandleListCount; i++) {
 		HandleList_t *p = &HandleList[i];
-		if (p->LoadFlag != DLL_GET_MODULE_HANDLE) {
-			FreeLibrary(p->handle);
-		}
-		free((void *)p->dllName);
+		DLLFree(p);
 	}
 	free(HandleList);
 	HandleList = NULL;

Modified: trunk/teraterm/common/dllutil.h
===================================================================
--- trunk/teraterm/common/dllutil.h	2021-08-28 15:28:48 UTC (rev 9381)
+++ trunk/teraterm/common/dllutil.h	2021-08-28 15:29:03 UTC (rev 9382)
@@ -31,14 +31,14 @@
 #endif
 
 typedef enum {
-	DLL_GET_MODULE_HANDLE,
-	DLL_LOAD_LIBRARY_SYSTEM,
-	DLL_LOAD_LIBRARY_CURRENT,
+	DLL_GET_MODULE_HANDLE,		// GetModuleHandleW() API\x82\xF0\x8Eg\x97p\x82\xB7\x82\xE9
+	DLL_LOAD_LIBRARY_SYSTEM,	// system \x83f\x83B\x83\x8C\x83N\x83g\x83\x8A\x82\xA9\x82\xE7 LoadLiberaryW() API\x82Ń\x8D\x81[\x83h
+	DLL_LOAD_LIBRARY_CURRENT,	// \x83J\x83\x8C\x83\x93\x83g\x83f\x83B\x83\x8C\x83N\x83g\x83\x8A\x82\xA9\x82\xE7 LoadLiberaryW() API\x82Ń\x8D\x81[\x83h
 } DLLLoadFlag;
 
 typedef enum {
-	DLL_ACCEPT_NOT_EXIST,
-	DLL_ERROR_NOT_EXIST,
+	DLL_ACCEPT_NOT_EXIST,	//	\x8C\xA9\x82‚\xA9\x82\xE7\x82Ȃ\xAD\x82Ă\xE0ok
+	DLL_ERROR_NOT_EXIST,	//	\x8C\xA9\x82‚\xA9\x82\xE7\x82Ȃ\xA2\x8Fꍇ\x83G\x83\x89\x81[
 } DLLFuncFlag;
 
 typedef struct {
@@ -56,10 +56,12 @@
 void DLLInit();
 void DLLExit();
 void DLLGetApiAddressFromLists(const DllInfo *dllInfos);
-DWORD DLLGetApiAddressFromList(const wchar_t *dllPath, DLLLoadFlag LoadFlag,
-							   DLLFuncFlag FuncFlag, const APIInfo *ApiInfo);
-DWORD DLLGetApiAddress(const wchar_t *dllPath, DLLLoadFlag LoadFlag,
+DWORD DLLGetApiAddressFromList(const wchar_t *fname, DLLLoadFlag LoadFlag,
+							   DLLFuncFlag FuncFlag, const APIInfo *ApiInfo, HANDLE *handle);
+DWORD DLLGetApiAddress(const wchar_t *fname, DLLLoadFlag LoadFlag,
 					   const char *ApiName, void **pFunc);
+void DLLFreeByFileName(const wchar_t *fname);
+void DLLFreeByHandle(HANDLE handle);
 
 #ifdef __cplusplus
 }

Modified: trunk/teraterm/teraterm/ttime.c
===================================================================
--- trunk/teraterm/teraterm/ttime.c	2021-08-28 15:28:48 UTC (rev 9381)
+++ trunk/teraterm/teraterm/ttime.c	2021-08-28 15:29:03 UTC (rev 9382)
@@ -40,109 +40,74 @@
 #include <imm.h>
 #include <assert.h>
 #include "asprintf.h"
+#include "dllutil.h"
 #include "ttime.h"
 
 // #define ENABLE_DUMP	1
 
-typedef LONG (WINAPI *TImmGetCompositionStringA)(HIMC, DWORD, LPVOID, DWORD);
-typedef LONG (WINAPI *TImmGetCompositionStringW)(HIMC, DWORD, LPVOID, DWORD);
-typedef HIMC (WINAPI *TImmGetContext)(HWND);
-typedef BOOL (WINAPI *TImmReleaseContext)(HWND, HIMC);
-typedef BOOL (WINAPI *TImmSetCompositionFontA)(HIMC, LPLOGFONTA);
-typedef BOOL (WINAPI *TImmSetCompositionFontW)(HIMC, LPLOGFONTW);
-typedef BOOL (WINAPI *TImmSetCompositionWindow)(HIMC, LPCOMPOSITIONFORM);
-typedef BOOL (WINAPI *TImmGetOpenStatus)(HIMC);
-typedef BOOL (WINAPI *TImmSetOpenStatus)(HIMC, BOOL);
+static LONG (WINAPI *PImmGetCompositionStringA)(HIMC, DWORD, LPVOID, DWORD);
+static LONG (WINAPI *PImmGetCompositionStringW)(HIMC, DWORD, LPVOID, DWORD);
+static HIMC (WINAPI *PImmGetContext)(HWND);
+static BOOL (WINAPI *PImmReleaseContext)(HWND, HIMC);
+static BOOL (WINAPI *PImmSetCompositionFontA)(HIMC, LPLOGFONTA);
+static BOOL (WINAPI *PImmSetCompositionFontW)(HIMC, LPLOGFONTW);
+static BOOL (WINAPI *PImmSetCompositionWindow)(HIMC, LPCOMPOSITIONFORM);
+static BOOL (WINAPI *PImmGetOpenStatus)(HIMC);
+static BOOL (WINAPI *PImmSetOpenStatus)(HIMC, BOOL);
 
-static TImmGetCompositionStringW PImmGetCompositionStringW;
-static TImmGetCompositionStringA PImmGetCompositionStringA;
-static TImmGetContext PImmGetContext;
-static TImmReleaseContext PImmReleaseContext;
-static TImmSetCompositionFontA PImmSetCompositionFontA;
-static TImmSetCompositionFontW PImmSetCompositionFontW;
-static TImmSetCompositionWindow PImmSetCompositionWindow;
-static TImmGetOpenStatus PImmGetOpenStatus;
-static TImmSetOpenStatus PImmSetOpenStatus;
-
-
 static HANDLE HIMEDLL = NULL;
 static LOGFONTA IMELogFontA;
 static LOGFONTW IMELogFontW;
 
+static const APIInfo imeapi[] = {
+	{ "ImmGetCompositionStringW", (void **)&PImmGetCompositionStringW },
+	{ "ImmGetCompositionStringA", (void **)&PImmGetCompositionStringA },
+	{ "ImmGetContext", (void **)&PImmGetContext },
+	{ "ImmReleaseContext", (void **)&PImmReleaseContext },
+	{ "ImmSetCompositionFontA", (void **)&PImmSetCompositionFontA },
+	{ "ImmSetCompositionFontW", (void **)&PImmSetCompositionFontW },
+	{ "ImmSetCompositionWindow", (void **)&PImmSetCompositionWindow },
+	{ "ImmGetOpenStatus", (void **)&PImmGetOpenStatus },
+	{ "ImmSetOpenStatus", (void **)&PImmSetOpenStatus },
+	{ NULL, NULL },
+};
+
 BOOL LoadIME(void)
 {
-  BOOL Err;
-  char imm32_dll[MAX_PATH];
-
-  if (HIMEDLL != NULL) return TRUE;
-
-  GetSystemDirectoryA(imm32_dll, sizeof(imm32_dll));
-  strncat_s(imm32_dll, sizeof(imm32_dll), "\\imm32.dll", _TRUNCATE);
-  HIMEDLL = LoadLibraryA(imm32_dll);
-  if (HIMEDLL == NULL)
-  {
-	return FALSE;
-  }
-
-  Err = FALSE;
-
-  PImmGetCompositionStringW = (TImmGetCompositionStringW)GetProcAddress(
-	HIMEDLL, "ImmGetCompositionStringW");
-  if (PImmGetCompositionStringW==NULL) Err = TRUE;
-
-  PImmGetCompositionStringA = (TImmGetCompositionStringA)GetProcAddress(
-	HIMEDLL, "ImmGetCompositionStringA");
-  if (PImmGetCompositionStringA==NULL) Err = TRUE;
-
-  PImmGetContext = (TImmGetContext)GetProcAddress(
-	HIMEDLL, "ImmGetContext");
-  if (PImmGetContext==NULL) Err = TRUE;
-
-  PImmReleaseContext = (TImmReleaseContext)GetProcAddress(
-	HIMEDLL, "ImmReleaseContext");
-  if (PImmReleaseContext==NULL) Err = TRUE;
-
-  PImmSetCompositionFontA = (TImmSetCompositionFontA)GetProcAddress(
-	HIMEDLL, "ImmSetCompositionFontA");
-  if (PImmSetCompositionFontA==NULL) Err = TRUE;
-
-  PImmSetCompositionFontW = (TImmSetCompositionFontW)GetProcAddress(
-	HIMEDLL, "ImmSetCompositionFontW");
-
-  PImmSetCompositionWindow = (TImmSetCompositionWindow)GetProcAddress(
-	HIMEDLL, "ImmSetCompositionWindow");
-  if (PImmSetCompositionWindow==NULL) Err = TRUE;
-
-  PImmGetOpenStatus = (TImmGetOpenStatus)GetProcAddress(
-	HIMEDLL, "ImmGetOpenStatus");
-  if (PImmGetOpenStatus==NULL) Err = TRUE;
-
-  PImmSetOpenStatus = (TImmSetOpenStatus)GetProcAddress(
-	HIMEDLL, "ImmSetOpenStatus");
-  if (PImmSetOpenStatus==NULL) Err = TRUE;
-
-  if ( Err )
-  {
-	FreeLibrary(HIMEDLL);
-	HIMEDLL = NULL;
-	return FALSE;
-  }
-
-  return TRUE;
+	HANDLE hDll;
+	DWORD error;
+	if (HIMEDLL != NULL) {
+		// 2\x8Fd\x8F\x89\x8A\xFA\x89\xBB?
+		return TRUE;
+	}
+	error = DLLGetApiAddressFromList(L"imm32.dll", DLL_LOAD_LIBRARY_SYSTEM, DLL_ERROR_NOT_EXIST, imeapi, &hDll);
+	if (error == NO_ERROR) {
+		HIMEDLL = hDll;
+	}
+	return error != NO_ERROR ? FALSE : TRUE;
 }
 
 void FreeIME(HWND hWnd)
 {
-  HANDLE HTemp;
+	HANDLE HTemp;
 
-  if (HIMEDLL==NULL) return;
-  HTemp = HIMEDLL;
-  HIMEDLL = NULL;
+	if (HIMEDLL == NULL)
+		return;
+	HTemp = HIMEDLL;
+	HIMEDLL = NULL;
 
-  /* position of conv. window -> default */
-  SetConversionWindow(hWnd,-1,0);
-  Sleep(1); // for safety
-  FreeLibrary(HTemp);
+	/* position of conv. window -> default */
+	SetConversionWindow(hWnd,-1,0);
+	Sleep(1); // for safety
+
+	DLLFreeByHandle(HTemp);
+	{
+		const APIInfo *p = imeapi;
+		while(p->ApiName != NULL) {
+			*p->func = NULL;
+			p++;
+		}
+	}
 }
 
 BOOL CanUseIME(void)


ttssh2-commit メーリングリストの案内
Back to archive index