问题
我正在尝试为玩具语言编写解释器,并且我希望它能够调用位于 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**
}
假设我有一个std::string func;
它是 DLL 中 proc 的名称,可能是"print"
or "add"
,而std::vector<int> args;
它的大小是目标函数的参数数量。我将如何相应地调用正确的 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 位)。我怎样才能做得更好?