コンセプトとしては今まで migemo.dll を直接呼び出していたソースを極力変更しないようにすることでしたので、今まで migemo.dll で使用していた関数を "__cdecl" で同じ名称/形式で エクスポートすることにしました。
#include <windows.h>
FARPROC funcs[6] ={
NULL,
NULL,
NULL,
NULL,
NULL,
NULL};
typedef int (*MIGEMO_PROC_INT2
CHAR)(
unsigned int,
unsigned char*);
typedef struct _migemo migemo;
typedef migemo *(*M_Func_Open)(
char*);
typedef int (*M_Func_Load)(migemo*,
int,
const char*);
typedef unsigned char*(*M_Func_Query)(migemo*,
const unsigned char*);
typedef void (*M_Func_Release)(migemo*,
const unsigned char*);
typedef void (*M_Func_Close)(migemo*);
typedef void (*M_Func_Setproc_Int2Char)(migemo* object, MIGEMO_PROC_INT2
CHAR proc);
HINSTANCE hInstMigemo =
NULL;
extern "C" volatile migemo* migemo_open(char* dict)
{
migemo* ret;
unsigned long reg_esp;
asm { mov reg_esp, esp }
ret = ((M_Func_Open)funcs[0])(dict);
asm { mov esp, reg_esp }
return ret;
}
extern "C" volatile int migemo_load(migemo* obj, int dict_id, char* dict_file)
{
int ret;
unsigned long reg_esp;
asm { mov reg_esp, esp }
ret = ((M_Func_Load)funcs[1])(obj ,dict_id , dict_file);
asm { mov esp, reg_esp }
return ret;
}
extern "C" volatile unsigned char* migemo_query(migemo* object, unsigned char* query)
{
unsigned char* ret;
unsigned long reg_esp;
asm { mov reg_esp, esp }
ret = ((M_Func_Query)funcs[2])(object,query);
asm { mov esp, reg_esp }
return ret;
}
extern "C" volatile void migemo_release(migemo* object, unsigned char* string)
{
unsigned long reg_esp;
asm { mov reg_esp, esp }
((M_Func_Release)funcs[3])(object,
string);
asm { mov esp, reg_esp }
}
extern "C" volatile void migemo_close(migemo* object)
{
unsigned long reg_esp;
asm { mov reg_esp, esp }
((M_Func_Close)funcs[4])(object);
asm { mov esp, reg_esp }
}
extern "C" volatile void migemo_setproc_int2char(migemo* object, MIGEMO_PROC_INT2CHAR proc)
{
unsigned long reg_esp;
asm { mov reg_esp, esp }
((M_Func_Setproc_Int2Char)funcs[5])(object , proc);
asm { mov esp, reg_esp }
}
extern "C" int GetFuncs(const char* dllpath)
{
if(hInstMigemo!=
NULL)
return false;
if((hInstMigemo = LoadLibrary(dllpath)) ==
NULL){
return false;
}
funcs[0] = GetProcAddress(hInstMigemo,
"migemo_open");
funcs[1] = GetProcAddress(hInstMigemo,
"migemo_load");
funcs[2] = GetProcAddress(hInstMigemo,
"migemo_query");
funcs[3] = GetProcAddress(hInstMigemo,
"migemo_release");
funcs[4] = GetProcAddress(hInstMigemo,
"migemo_close");
funcs[5] = GetProcAddress(hInstMigemo,
"migemo_setproc_int2char");
for(
int i=0;i<=5;++i)
if(funcs[i] ==
NULL)
return false;
return true;
}
int ReleaseFuncs()
{
FreeLibrary(hInstMigemo);
hInstMigemo=
NULL;
return true;
}
extern "C" BOOL APIENTRY DllEntryPoint(HINSTANCE, DWORD reason, LPVOID)
{
if(reason == DLL_PROCESS_DETACH)ReleaseFuncs();
return true;
}
いろいろと手抜きをしていますが、早い話が、 GetFuncs って関数に migemo.dll のパスを渡して LoadLibrary 下直後に呼び出してやれば、後は migemo.dll と同じにすればいいようになっています。
DLLを作ったことのある方はお気づきでしょうが、普通あるはずの「DllMain」関数がなく同じような形式で、「DllEntryPoint」なんて関数が定義されています。