問題
おもちゃの言語のインタープリターを作成しようとしていますが、DLLにある関数を呼び出せるようにしたいと考えています。いくつかexternal.dll
私は持っています:
#include <cstdio>
extern "C" {
__declspec(dllexport) void print(int val) { printf("%i\n", val); }
__declspec(dllexport) int add(int a, int b) { return a + b; }
... more functions **that I don't know then names of**
}
DLLstd::string func;
内のprocの名前(おそらく"print"
または"add"
)と、std::vector<int> args;
そのサイズがターゲット関数の引数の数であるaがあるとします。それに応じて正しいDLL関数を呼び出すにはどうすればよいですか?理想的には、を使用してロードできる任意の関数を呼び出せるようにしたいと思いますGetProcAddress
。
私の回避策
私は現在、MSVCのインラインアセンブラを使用して、やりたいことを実行しています。それは次のようなものです:
int WorkaroundCall(const std::string& func, const std::vector<int>& args) {
void* proc = GetProcAddress(hmod, func.c_str()); // hmod is the DLL's HMODULE
void* spsave, * argframe;
size_t argsize = sizeof(int) * args.size();
const int* argdata = args.data();
__asm {
mov eax, esp
sub eax, argsize
mov argframe, eax
}
memcpy(argframe, argdata, argsize);
__asm {
mov spsave, esp
mov esp, argframe
xor edx, edx
call proc
mov esp, spsave
}
}
ただし、これはアセンブリを使用し、システムに依存するため、明らかに適切なソリューションではありません(64ビットでは機能しないとのことです)。どうすればこれをより良くすることができますか?