c++ - 在动态加载的 dll 中查找名称错误的函数

标签 c++ c windows visual-studio dll

我有一组明确设计为仅在 C++ 中使用的 API。我不希望 C 程序(或与此相关的任何其他语言)使用它们,因此我导出命名空间和类信息,而不是使用 extern "C" 路由并使用内联实用函数来调用普通 C 函数。

现在我只处理在编译时链接的 dll,这意味着将函数导入可执行文件非常容易,因为我不需要做任何工作。但是,我计划开发一个插件系统,它需要我在运行时动态加载 dll。我能否使用 GetProcAddress() 找到名称困惑的 C++ 函数?

最佳答案

你正在做的是 not necessarily a good idea除非您控制整个构建链并且可以确保您的 DLL 和使用它的任何应用程序都是使用同一编译器的同一版本构建的。

话虽如此,是的,您可以使用 GetProcAddress 加载名称错位的函数。只需使用 Dependency Walker或者查看为您的 DLL 生成的 .def 文件(如果您的编译器设置为生成一个文件),以获取损坏的函数名称。然后你可以 GetProcAddress 它。但是,您不能使用未损坏的名称调用 GetProcAddress 并期望它找到正确的损坏名称。例如,如果您的 DLL 函数名为 Add,并且被分解为 _Z3Addv,则您需要调用 GetProcAddress(myDLL, "_Z3Addv"); 以正确访问函数。

每次更改函数声明时,您都需要更改对 GetProcAddress 的调用,因为错位名称也会更改。请注意,如果更改构建 DLL 所用的编译器,您还需要更改 GetProcAddress 调用 - MSVC 的处理与 GCC 的有很大不同,而 clang 的处理可能与两者不同。因此,您可能需要重新考虑执行此操作的方式,因为它似乎很容易在途中的某个地方中断。

关于c++ - 在动态加载的 dll 中查找名称错误的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23314750/

相关文章:

c++ - 作为参数传递的打印函数指针导致在屏幕上打印 '1'

c - 如何实现返回 'Pop' 元素(即数据/值)的 "popped"函数? (链表堆栈)

c++ - 在 C/C++ 中通过 TCP 套接字发送十六进制

windows - 文件夹上的 Powershell Remove-Item 仅在通过 Ansible 运行时失败

windows - 为变量分配多个驱动器号

c++ - 逐字段构造函数生成的规则是什么?

c++ - 为什么我在没有 calloc 函数的情况下会出现运行时错误?

使用 int 数组按引用调用。 2个功能

python - 无法在 Mac 上取消在 Windows 上 pickle 的文件

c++ - 在 C++ 中,引用限定符是否表达某种形式的子类型?