gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:03:41 30 4
gpt4 key购买 nike

我有一组明确设计为仅在 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/

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