EXE側の関数をDLLから呼び出す
2010年8月24日 コンピュータ仕事の防備録。
Windows(Visual Studio 2010)にUNIXプログラム(ANSI-C)を移植するお仕事をしています。
・追加機能としてDLLを別途作成することができる。このDLLはデフォルトでは存在しない。
→LoadLibrary()で動的リンクすればOK
・DLL側からEXE側の関数を呼びたい。でも暗号解読関数とかあるのでインターフェースのみ公開したい。
→DLLを分割する。呼ばせたい関数が少しなら、関数のポインタを引数として渡してしまうのも有り。
→呼ばせたい関数の数が多いのでポインタ渡しは勘弁。
→呼ばれる関数を切り出してDLL分割するには、いくつかのソースファイルを分割する必要があるが、それが上司に却下される。
どうしようかと困っていたら、もう1つやり方があった。
EXE側で呼ばせたい関数にdllエクスポートの指定をする。するとビルドしたときにlibファイルも作成されるので、それをDLLビルド時にリンクする。
とりあえずVS2010では動くっぽい。
Windows(Visual Studio 2010)にUNIXプログラム(ANSI-C)を移植するお仕事をしています。
・追加機能としてDLLを別途作成することができる。このDLLはデフォルトでは存在しない。
→LoadLibrary()で動的リンクすればOK
・DLL側からEXE側の関数を呼びたい。でも暗号解読関数とかあるのでインターフェースのみ公開したい。
→DLLを分割する。呼ばせたい関数が少しなら、関数のポインタを引数として渡してしまうのも有り。
→呼ばせたい関数の数が多いのでポインタ渡しは勘弁。
→呼ばれる関数を切り出してDLL分割するには、いくつかのソースファイルを分割する必要があるが、それが上司に却下される。
どうしようかと困っていたら、もう1つやり方があった。
EXE側で呼ばせたい関数にdllエクスポートの指定をする。するとビルドしたときにlibファイルも作成されるので、それをDLLビルド時にリンクする。
とりあえずVS2010では動くっぽい。
// まずはEXE側のソース
#include <Windows.h>
#include <stdio.h>
// Proto Type
__declspec(dllexport) int EXE_FUNC(char*);
// DLL関数のポインタ
typedef int (*DLL_FUNC)(char *);
// struct
typedef struct {
int flg;
char work[16];
} TEST_ARG;
int main(void)
{
// DLLを動的リンクするための変数
HMODULE hmod;
DLL_FUNC dll_func;
// DLLの関数に引き渡す変数
TEST_ARG test_arg;
memset(&test_arg, 0, sizeof(TEST_ARG));
// DLL動的リンク start
hmod = LoadLibrary("test.dll");
if(hmod != NULL)
{
// DLLの関数を呼び出す
dll_func = (DLL_FUNC)GetProcAddress(hmod, "DLL_FUNC");
if(dll_func != NULL)
{
dll_func((char*)&test_arg);
}
}
FreeLibrary(hmod);
// DLL動的リンク end
return 0;
}
// DLLから呼び出される関数
int EXE_FUNC(char *arg)
{
// 引数を構造体にセット
TEST_ARG *w_arg = NULL;
w_arg = (TEST_ARG *)arg;
// 値の変更
memcpy(w_arg->work, "1", 1);
w_arg->flg = 99;
return 0;
}
--------------------
// ここからDLL側のソース
#include <Windows.h>
// EXEのlibファイルをリンク
#pragma comment(lib, "testexe.lib")
// Proto Type
__declspec(dllexport) int DLL_FUNC(char *);
extern int EXE_FUNC(char *);
// EXEから呼ばれる関数
int DLL_FUNC(char *test_arg)
{
// EXEの関数を呼び出す
EXE_FUNC(test_arg);
return 0;
}
コメント