Как декодировать параметры метода Visual C ++ для искаженных украшенных имен? - PullRequest
3 голосов
/ 05 октября 2011

Ниже приведены примеры экспортированных имен:

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 ]

3 голосов
/ 06 октября 2011

Запустите утилиту undname.exe из командной строки Visual Studio.Используйте команду Edit + Paste в системном меню, чтобы избежать необходимости вводить имя.Пример вывода:

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 *)"
2 голосов
/ 05 октября 2011

Здесь - статья, объясняющая алгоритм искажения, используемый Visual C ++.

В вашем случае, я думаю, что первая функция будет:

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

У меня нет доступа к машине с Windows для тестирования.

1 голос
/ 06 октября 2011

Вы можете использовать функцию UnDecorateSymbolName.

К сожалению, на сайте pinvoke.net нет объявления p / invoke.

Попробуйте что-то вроде:

[DllImport("Dbghelp.dll", SetLastError = true)]
static extern uint UnDecorateSymbolName(string decorated, StringBuffer undecoratedBuffer, uint undecoratedBufferLength, uint flags);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...