如何解码受损装饰名称的Visual C ++方法参数?

时间:2011-10-05 08:12:37

标签: visual-c++

鉴于下面的导出名称示例:

0x00cf ?GetI@PyIDispatch@@SAPAUIDispatch@@PAU_object@@@Z
0x0119 ?ParseTypeInformation@PythonOleArgHelper@@QAEHPAU_object@@@Z
0x014f ?PyObject_FromSTGMEDIUM@@YAPAVPySTGMEDIUM@@PAUtagSTGMEDIUM@@@Z

方法 GetI ParseTypeInformation PyObject_FromSTGMEDIUM 的方法参数是什么?

目前的解决方法是跳过解析参数,但是我有如下所示的无信息差距:)

PyObject_FromSTGMEDIUM(...)
ParseTypeInformation(...)
GetI(...)

参考文献:

  

stdcall的形式为_name @ x,而fastcall的形式为@ name @ x

算法如何解码参数? C#中的示例很棒。

约束:PInvoke不可用。

请在anwser中给出上述示例的参数。 谢谢!

3 个答案:

答案 0 :(得分:3)

从Visual Studio命令提示符运行undname.exe实用程序。使用系统菜单中的编辑+粘贴命令,以避免必须键入名称。样本输出:

C:\temp>undname ?GetI@PyIDispatch@@SAPAUIDispatch@@PAU_object@@@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.

Undecoration of :- "?GetI@PyIDispatch@@SAPAUIDispatch@@PAU_object@@@Z"
is :- "public: static struct IDispatch * __cdecl PyIDispatch::GetI(struct _objec
t *)"

答案 1 :(得分:2)

Here是一篇解释Visual C ++使用的修改算法的文章。

在你的情况下,我认为第一个功能是:

static ::IDispatch* PyIDispatch::GetI(::_object*);

但我无法访问Windows计算机进行测试。

答案 2 :(得分:1)

您可以使用UnDecorateSymbolName功能。

不幸的是,pinvoke.net上还没有p / invoke声明。

尝试类似:

[DllImport("Dbghelp.dll", SetLastError = true)]
static extern uint UnDecorateSymbolName(string decorated, StringBuffer undecoratedBuffer, uint undecoratedBufferLength, uint flags);