显式DLL函数调用任何函数

时间:2015-06-13 22:35:05

标签: c++ dll

我正在尝试使用本教程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;
}

上面的代码显示了消息框:

enter image description here

但随后会显示以下错误消息:

enter image description here

可能导致上述错误是因为参数为void *其中是正确的类型(HWND,LPCSTR,LPCSTR和UINT),但值未定义。

那么,如何使用任何名称,任何类型,任何数量的参数调用任何dll函数的函数?可能吗?其他语言(如python,ruby)如何在运行时执行此操作?

0 个答案:

没有答案