Ниже приведены примеры экспортированных имен:
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.Спасибо!
Запустите утилиту 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 *)"
Здесь - статья, объясняющая алгоритм искажения, используемый Visual C ++.
В вашем случае, я думаю, что первая функция будет:
static ::IDispatch* PyIDispatch::GetI(::_object*);
У меня нет доступа к машине с Windows для тестирования.
Вы можете использовать функцию UnDecorateSymbolName.
UnDecorateSymbolName
К сожалению, на сайте pinvoke.net нет объявления p / invoke.
Попробуйте что-то вроде:
[DllImport("Dbghelp.dll", SetLastError = true)] static extern uint UnDecorateSymbolName(string decorated, StringBuffer undecoratedBuffer, uint undecoratedBufferLength, uint flags);