Призыв к функции участника иностранного C ++ DLL с изуродованными именами из PythonC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Призыв к функции участника иностранного C ++ DLL с изуродованными именами из Python

Сообщение Anonymous »

У меня есть C ++ DLL, в который я хочу позвонить из Python. Я не контролирую C ++ DLL, и у меня есть его исходный код или заголовки.

Код: Выделить всё

2980  BA3 005A3060 ?getFoo@FooLib@@YAAEAVFoo@1@XZ
2638  A4D 005A3020 ?getApplicationData@Foo@FooLib@@QEAAAEAVApplicationData@2@XZ
2639  A4E 005A3030 ?getApplicationData@Foo@FooLib@@QEBAAEBVApplicationData@2@XZ
2738  AB1 000F8A30 ?getDataRootPath@ApplicationData@FooLib@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@XZ
< /code>
С помощью Copilot я смог перевести их на (скрещивая пальцы, что это правильно): < /p>
Foo __cdecl FooLib::getFoo()
ApplicationData& __thiscall FooLib::Foo::getApplicationData()
const ApplicationData& __thiscall FooLib::Foo::getApplicationData() const
std::wstring __thiscall FooLib::ApplicationData::getDataRootPath() const
из Python, с ctypes docs, я смог собрать это:

Код: Выделить всё

from ctypes import *
dll = WinDLL(r"c:\path\to\Foo.dll")

getFoo = getattr(dll, "?getFoo@FooLib@@YAAEAVFoo@1@XZ")
getFoo.argtypes = []
getFoo.restype = c_void_p

getAppData = getattr(dll, "?getApplicationData@Foo@FooLib@@QEAAAEAVApplicationData@2@XZ")
getAppData.argtypes = [c_void_p]
getAppData.restype = c_void_p

getAppData(getFoo()) # returns a pointer reliably, same value each time
Обратите внимание, что в отношении Python ctypes , две записи DLL для getApplicationData создают одни и те же значения.
Однако окончательная функция не работает, сбоя питона или бросает насилие доступа, вероятно, потому что она возвращает тип строки C+ и Codeps

Подробнее здесь: https://stackoverflow.com/questions/797 ... -from-pyth
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»