显式DLL函数调用任何函数 我试图在本教程的基础上用C++编写实验解释语言。现在我想在运行时实现一个调用 DLL< /C>函数的系统,为此我尝试在C++中使用显式链接。但是数据的类型和参数的数量是未定义的,这取决于解释器处理的代码,我已经尝试使用变量函数(因为参数的数量未知)和无效指针(因为参数的类型未知),但它仍然不起作用

显式DLL函数调用任何函数 我试图在本教程的基础上用C++编写实验解释语言。现在我想在运行时实现一个调用 DLL< /C>函数的系统,为此我尝试在C++中使用显式链接。但是数据的类型和参数的数量是未定义的,这取决于解释器处理的代码,我已经尝试使用变量函数(因为参数的数量未知)和无效指针(因为参数的类型未知),但它仍然不起作用,c++,dll,C++,Dll,下面的代码只是一个测试,稍后将在我的项目中实现: 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*

下面的代码只是一个测试,稍后将在我的项目中实现:

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;
}
typedef VOID*(WINAPI*_DLLPROC)(…);//它是可变的,因为参数没有定义
//我试着用变量来做(像这样)
//VOID*calldllffunction(LPCWSTR dllName、LPCSTR funcName、int numArgs,…)
VOID*CallDllFunctionA(LPCWSTR dllName,LPCSTR funcName,VOID*val1,VOID*val2,VOID*val3,VOID*val4)
{
//va_list ap;//我尝试使用变量
//
HINSTANCE hinstLib=加载库(dllName);
作废*收回;
_DLLPROC func=(u DLLPROC)GetProcAddress(hinstLib,funcName);
//
//va_启动(ap、numArgs);
if(hinstLib!=NULL)
{
尝试
{
retVal=(func)(val1,val2,val3,val4);
}
捕获(…)
{
投掷;
}
}
其他的
{

“上述错误可能是由于参数为void*”造成的,也可能是由于错误消息所说的内容导致的?要进一步了解@LightnessRacesinOrbit所说的内容,您可能需要阅读WinAPI调用约定:。。