我希望在托管代码的非托管C ++ DLL上使用LoadLibrary,然后在已经损坏的外部函数上调用GetProcAddress。我的问题是你从C ++编译器确定性得到的错误名称?那就是:如果原始的签名没有改变,名称是否总是被转换为相同的错位名称?
答案 0 :(得分:6)
它没有由标准指定,并且在我的经验中肯定在同一编译器的版本之间发生了变化,尽管它必须在某些固定情况下是确定性的,因为否则将无法单独链接两个编译模块。
如果你正在使用GetProcAddress
,那么将函数导出为extern "C"
会更加清晰,因此它们的名称不会被破坏。
答案 1 :(得分:2)
正如其他人所说,它是特定于编译器的。但是,您可以在Agner Fog的文档中找到详细信息......
http://www.agner.org/optimize/#manuals
见该页的第5项。
此外,现在有些库可以为您处理常见编译器的修改和解码。对于Visual C ++,起点是dbghelp和imagehlp库。
http://msdn.microsoft.com/en-us/library/ms679292%28v=VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/ms680321%28v=VS.85%29.aspx
答案 2 :(得分:0)
每个编译器对名称管理的处理方式不同(可能与否 - 没有标准)。如果在C ++代码中使用纯C函数,则可以使用extern“C”来压缩C函数的名称管理,以便编译器能够找到它们。