我希望使用托管代码在非托管C++动态链接库上执行LoadLibrary,然后在已损坏的外部函数上调用GetProcAddress。我的问题是,你从C++编译器得到的乱码是确定性的吗?也就是说:如果原件的签名没有改变,名字会一直被转换成相同的损坏的名字吗?
发布于 2010-07-15 06:15:22
它没有在标准中指定,在我的经验中,相同编译器的不同版本之间肯定会发生变化,尽管在某些固定的环境下它必须是确定性的,因为否则就没有办法链接两个单独编译的模块。
如果您使用的是GetProcAddress
,那么将函数导出为extern "C"
会更加简洁,这样它们的名称就不会被破坏。
发布于 2010-07-15 06:37:52
正如其他人所说,这是特定于编译器的。然而,你可以在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
发布于 2010-07-15 06:18:31
每个编译器处理名称管理的方式都不同(可能是也可能不是--没有标准)。如果您在C++代码中使用纯C函数,则可以使用外部"C“来抑制C函数的名称管理,以便编译器能够找到它们。
https://stackoverflow.com/questions/3252909
复制