我正在查看使用depends从dll导出的函数列表,我注意到名称中包含一些奇怪的符号。它们的格式为
??0Function Name@@QEAA@AEBV0@@Z
0也可能被其他一些数字取代。
@@和字母数量有所不同。
有人可以说出他们代表什么吗?
答案 0 :(得分:1)
这是由C ++编译器修饰的C ++标识符的名称。您可以从Visual Studio命令提示符运行undname.exe实用程序,将其转换回原始C ++声明:
C:\>undname ??0Foo@@QEAA@AEBV0@@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.
Undecoration of :- "??0Foo@@QEAA@AEBV0@@Z"
is :- "public: __cdecl Foo::Foo(class Foo const & __ptr64) __ptr64"
这使得它成为Foo类的复制构造函数,编译为64位代码。我所知道的没有记录确切的装饰算法。通常,名称修饰用于避免链接器符号冲突,因为C ++支持重载。您可以使用extern "C"
来抑制装饰,但这不适用于C ++类。
答案 1 :(得分:0)
在某些情况下,您可能有兴趣使用Microsoft提供的API UnDecorateSymbolName以编程方式解开这些名称。