鉴于下面的导出名称示例:
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中给出上述示例的参数。 谢谢!
答案 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);