微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在dynamic加载的dll中查找name-mangled函数

我有一套明确被devise为仅用于C ++的API。 我不希望它们被C程序(或任何其他语言)使用,因此我输出命名空间和类的信息,而不是使用extern "C"path,并使用内联的效用函数调用plain C函数

现在我只处理在编译时链接的dll,这意味着将函数导入到可执行文件非常容易,因为它不涉及我的工作。 不过,我打算开发一个插件系统,这将需要我在运行时dynamic加载dll。 我能使用GetProcAddress()find名称改变的C ++函数吗?

为什么在VCC 2003中编译这么长时间?

从C ++类制作Visual C ++ DLL

随机无法parsing的外部符号,不应该在那里

在visual c ++项目中添加文件

错误C2327:不是types名称,静态或枚举器

除非您控制整个构建链,并且可以确保您的DLL和使用它的任何应用程序使用相同版本的相同编译器构建,否则您所做的不一定是个好主意 。

有了这个说法,是的,你可以使用GetProcAddress加载名称改变的函数。 只要使用Dependency Walker或者查看为你的DLL生成的.def文件,如果你的编译器被设置为产生一个,就可以得到错误函数名。 那么你可以GetProcAddress它。 但是,您不能使用一个未加密的名称调用GetProcAddress ,并期望它找到正确的错位名称。 例如,如果您的DLL的函数名为Add ,并且被修改为_Z3Addv ,则需要调用GetProcAddress(myDLL,"_Z3Addv"); 正确访问该功能

每次更改函数的声明时,都需要将调用更改为GetProcAddress ,因为重名的名称也会更改。 注意你也需要改变GetProcAddress调用,如果你改变你的DLL的编译器 – MSVC的修改与GCC有很大的不同,而且clang的修改可能不同于他们两个。 所以你可能想重新考虑你这样做的方式,因为它似乎很容易在这个方向上打破。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐