在动态加载的dll中查找名称受损的函数

时间:2014-04-26 18:11:11

标签: c++ c windows visual-studio dll

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

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

1 个答案:

答案 0 :(得分:3)

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

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

每次更改函数声明时都需要将调用更改为GetProcAddress,因为错位的名称也会更改。请注意,如果您更改了DLL构建的编译器,您还需要更改GetProcAddress调用 - MSVC的修改与GCC相比有很大的不同,并且铿锵作响可能与他们两个都不同。所以你可能想重新考虑一下你这样做的方式,因为它似乎很容易在整个过程中破坏。