我正在尝试使用本教程http://compilers.iecc.com/crenshaw/制作一种实验性解释语言,但是在C ++中。现在我想实现一个在运行时调用dll
函数的系统,为此我尝试在C ++中使用显式链接。但是数据的类型和参数的数量是未定义的,它取决于解释器处理的代码,我已经尝试使用variadic函数(因为未知数量的参数)和void指针(因为未知类型的参数)但是它仍然不起作用。
以下代码只是稍后在我的项目中实施的测试:
typedef VOID* (WINAPI *_DLLPROC)(...); // it's variadic because the parameters are undefined
// I Tried to do it using variadic (like this)
// VOID* CallDllFunction(LPCWSTR dllName, LPCSTR funcName, int numArgs, ...)
VOID* CallDllFunctionA(LPCWSTR dllName, LPCSTR funcName, void* val1, void* val2, void* val3, void* val4)
{
//va_list ap; // I tried to use variadic
//
HINSTANCE hinstLib = LoadLibrary(dllName);
VOID* retVal;
_DLLPROC func = (_DLLPROC)GetProcAddress(hinstLib, funcName);
//
//va_start(ap, numArgs);
if (hinstLib != NULL)
{
try
{
retVal = (func)(val1, val2, val3, val4);
}
catch (...)
{
throw;
}
}
else
{
cout << "Error!" << endl;
}
//va_end(ap);
//
FreeLibrary(hinstLib);
//
return retVal;
}
int main( void )
{
CallDllFunctionA(L"User32.dll", "MessageBoxA", 0, "Hello", "Title", MB_OK);
printf("\n");
system("PAUSE");
return 0;
}
上面的代码显示了消息框:
但随后会显示以下错误消息:
可能导致上述错误是因为参数为void *其中是正确的类型(HWND,LPCSTR,LPCSTR和UINT),但值未定义。
那么,如何使用任何名称,任何类型,任何数量的参数调用任何dll函数的函数?可能吗?其他语言(如python,ruby)如何在运行时执行此操作?