GIMP 2.8ツールオプションに文字消えるバグの回避パッチの作成方法

GIMP 2.8 (Win32)は中国語および日本語OSで実行する時、
ツールオプションに文字はよく消える。
回避対策として環境変数のLANGをenに設定すればいい。

前に私はその「環境変数LANGをenにする」って手順をEXEに入らせる。
今はその方法より簡単な方法をここで紹介する。

使ったツールはVC++、そしてCFF Explorer。

「環境変数LANGをenにする」と言うC言語コードはこれです:


putenv("LANG=en");
でもgimp-2.8.exe使ってるC言語ランタイムは自分のVCコンパイラーの使ってるC言語ランタイムと違ってる可能性がある。安全な方法はLoadLibraryとGetProcAddressでputenv関数のアドレスを取得する

HMODULE hCRT = LoadLibraryW(L"msvcrt.dll");
int (__cdecl *fPutenv)(const char*) = (int (__cdecl*)(const char*)) GetProcAddress(hCRT, "_putenv");
fPutenv("LANG=en");
このコードをDLLファイルに入る、そしてgimp-2.8.exeの起動するときその自作DLLをロードすればパッチはできた。

#include <windows.h>
DWORD CALLBACK DllMain(HINSTANCE hDll, DWORD nReason, LPVOID pUseless)
{
if (nReason == DLL_PROCESS_ATTACH) {
HMODULE hCRT = LoadLibraryW(L"msvcrt.dll");
int (__cdecl *fPutenv)(const char*) = (int (__cdecl*)(const char*)) GetProcAddress(hCRT, "_putenv");
fPutenv("LANG=en");
}
return TRUE;
}
extern "C" __declspec(dllexport) void dummy() {}

起動するときDLLをロードしたいなら、何かの関数をインポートしないとだめです。だからそのdummyは・・・
このソースをコンパイルする:
cl /LD gimpPatch.cpp

そしてCFF Explorerの出番です。CFF Explorerでgimp-2.8.exeを開いて、
左側でImport Adder機能を選んで、右側でAdd -> gimpPatch.dll -> dummy -> Import By Name -> Rebuild Import Table。後はEXEファイルをセーブして、完成です。

gimpPatch.dllをgimp-2.8.exeと同じフォルダで放置して、gimp2.8.exe起動して試す。そのバグを回避したはず。

パッチ作成は普通でUDM Free利用すればいい。

私の使った方法はDLLの代わりに、直接そのコードをGIMP-2.8.exeに入る。
パッチ作成はNSISとVPatchを利用するのです。