6

我希望在带有托管代码的非托管 C++ DLL 上加载库,然后在已损坏的外部函数上调用 GetProcAddress。我的问题是您从 C++ 编译器中获得的错误名称是确定性的吗?那就是:如果原件的签名没有改变,这个名字是否总是被转换成相同的错误名字?

4

3 回答 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 回答