gpt4 book ai didi

c++ - C 将参数作为空指针列表传递给从 LoadLibrary() 导入的函数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:51 27 4
gpt4 key购买 nike

我遇到的问题是我想创建一个通用的命令行应用程序,该应用程序可用于加载库 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);    }

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

最佳答案

在调用它之前,您需要将 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

然后您获取从 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]);

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

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

关于c++ - C 将参数作为空指针列表传递给从 LoadLibrary() 导入的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28996696/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com