c++编译后会给函数签名加上很多特有的修饰,比如bool ReqGetGuildUserList(long)将会被编译成?ReqGetGuildUserList@@YA_NJ@Z。用Dependency Walker这个工具可以看的很清楚的。
Dependency Walker工具一般是用来查看dll或者exe的依赖项的,这样就可以在软件发布的时候避免漏掉某些dll,当然对于动态加载的dll是没有办法的。但其中的Undecorate C++ Functions功能也甚是好用。
编译后的dll导出签名格式
功能强大的Undecorate C++ Functions
Undecorate后的C++签名,这样就看的很清楚了
如果要在代码中做这样的转换也是可以的。Windows提供了一个UnDecorateSymbolName函数,用来Undecorates the specified decorated C++ symbol name。该函数的签名为:
DWORD WINAPI UnDecorateSymbolName( __in PCTSTR DecoratedName, __out PTSTR UnDecoratedName, __in DWORD UndecoratedLength, __in DWORD Flags );
如果要在C#中用,对应的PInvoke格式为:
[DllImport("Dbghelp.dll", CharSet = CharSet.Ansi)]
private static extern int UnDecorateSymbolName(
[MarshalAs(UnmanagedType.LPStr)]string DecorateName,
[Out, MarshalAs(UnmanagedType.LPStr)]StringBuilder UnDecoratedName,
int UndecoratedLength,
int Flags);
public static string UnDecorateSymbolName(string symbolName)
{
StringBuilder sb = new StringBuilder();
int len = UnDecorateSymbolName(symbolName, sb, sb.MaxCapacity, 0);
if(len != 0)
return sb.ToString();
else
return symbolName;
}
评论