C将参数作为void-pointer-list传递给LoadLibrary()中的导入函数

h4x*_*x0r 6 c c++ winapi pointers function-pointers

我的问题是我想创建一个通用命令行应用程序,可用于加载库DLL,然后调用库DLL中的函数.函数名称在命令行中指定,参数也在实用程序命令行中提供.

我可以从使用该LoadLibrary()函数动态加载的DLL访问外部函数.一旦加载了库,我就可以获得一个指向函数的指针,GetProcAddress()我希望用命令行中指定的参数调用该函数.

我可以将一个void-pointer-list传递给函数指针,该函数指针是由LoadLibrary()类似下面示例的函数返回的?

为了简化示例代码,我删除了错误检查.有没有办法让这样的工作:

    //Somewhere in another dll
    int DoStuff(int a, int b)
    {
        return a + b;
    }
    int main(int argc, char **argv)
    {
        void *retval;
        void *list = argv[3];
        HMODULE dll;
        void* (*generic_function)(void*);

        dll = LoadLibraryA(argv[1]);

        //argv[2] = "DoStuff"
        generic_function = GetProcAddress(dll, argv[2]);

        //argv[3] = 4, argv[4] = 7, argv[5] = NULL
        retval = generic_function(list);
    }

如果我忘记提及必要的信息,请告诉我.提前致谢

Chr*_*odd 4

LoadLibrary在调用之前,您需要将返回的函数指针转换为具有正确参数类型的函数指针。管理它的一种方法是使用一些调用适配器函数,这些函数可以为您可能想要调用的每种可能的函数类型执行正确的操作:

void Call_II(void (*fn_)(), char **args) {
    void (*fn)(int, int) = (void (*)(int, int))fn_;
    fn(atoi(args[0]), atoi(args[1]));
}
void Call_IS(void (*fn_)(), char **args) {
    void (*fn)(int, char *) = (void (*)(int, char *))fn_;
    fn(atoi(args[0]), args[1]);
}
...various more functions
Run Code Online (Sandbox Code Playgroud)

然后,您获取从中获得的指针GetProcAddress和附加参数,并将它们传递给正确的Call_X函数:

void* (*generic_function)();

dll = LoadLibraryA(argv[1]);

//argv[2] = "DoStuff"
generic_function = GetProcAddress(dll, argv[2]);

//argv[3] = 4, argv[4] = 7, argv[5] = NULL

Call_II(generic_function, &argv[3]);
Run Code Online (Sandbox Code Playgroud)

问题是您需要知道要获取指针的函数的类型是什么,并调用适当的适配器函数。这通常意味着创建一个函数名称/适配器表并在其中进行查找。

相关的问题是,没有类似的函数GetProcAddress可以告诉您库中函数的参数类型——该信息根本没有存储在 dll 中可访问的任何位置。