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)