我希望在带有托管代码的非托管 C++ DLL 上加载库,然后在已损坏的外部函数上调用 GetProcAddress。我的问题是您从 C++ 编译器中获得的错误名称是确定性的吗?那就是:如果原件的签名没有改变,这个名字是否总是被转换成相同的错误名字?
问问题
1786 次
3 回答
6
它没有由标准指定,并且根据我的经验,在同一编译器的版本之间肯定会发生变化,尽管它必须在某些固定的情况下具有确定性,因为否则将无法链接两个单独编译的模块。
如果您正在使用GetProcAddress
,则导出函数会更干净,因为extern "C"
它们的名称不会被破坏。
于 2010-07-15T06:15:22.330 回答
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
于 2010-07-15T06:37:52.467 回答
0
每个编译器都以不同的方式处理名称处理(可能或没有 - 没有标准)。如果您在 C++ 代码中使用纯 C 函数,则可以使用 extern "C" 来抑制 C 函数的名称修改,以便编译器能够找到它们。
于 2010-07-15T06:18:31.023 回答