2016-08-17 3 views
0

У меня есть учебник о вызовах функций из dll c/C++, пример написан здесь с official tutorial.Методы вызова из C/C++ DLL с Python

WINUSERAPI int WINAPI 
MessageBoxA(
    HWND hWnd, 
    LPCSTR lpText, 
    LPCSTR lpCaption, 
    UINT uType); 

Here is the wrapping with ctypes: 

>>> 
>>> from ctypes import c_int, WINFUNCTYPE, windll 
>>> from ctypes.wintypes import HWND, LPCSTR, UINT 
>>> prototype = WINFUNCTYPE(c_int, HWND, LPCSTR, LPCSTR, UINT) 
>>> paramflags = (1, "hwnd", 0), (1, "text", "Hi"), (1, "caption", None), (1, "flags", 0) 
>>> MessageBox = prototype(("MessageBoxA", windll.user32), paramflags) 
>>> 
The MessageBox foreign function can now be called in these ways: 

>>> 
>>> MessageBox() 
>>> MessageBox(text="Spam, spam, spam") 
>>> MessageBox(flags=2, text="foo bar") 
>>> 
A second example demonstrates output parameters. The win32 GetWindowRect function retrieves the dimensions of a specified window by copying them into RECT structure that the caller has to supply. Here is the C declaration: 

WINUSERAPI BOOL WINAPI 
GetWindowRect(
    HWND hWnd, 
    LPRECT lpRect); 
Here is the wrapping with ctypes: 

>>> 
>>> from ctypes import POINTER, WINFUNCTYPE, windll, WinError 
>>> from ctypes.wintypes import BOOL, HWND, RECT 
>>> prototype = WINFUNCTYPE(BOOL, HWND, POINTER(RECT)) 
>>> paramflags = (1, "hwnd"), (2, "lprect") 
>>> GetWindowRect = prototype(("GetWindowRect", windll.user32), paramflags) 
>>> 

Этот пример работает, когда функция является внешним, однако, давайте предположим, что у меня есть ссылка на объект, и я хочу, чтобы вызвать функцию из этого объекта с Params, как я могу это сделать?

Я видел журнал всех сигнатур функций из 'dumpbin -exports', и я попытался использовать полное имя функции, и все же это не сработало.

Любые другие идеи будут благословлены.

+0

Откуда вы знаете, что это не сработало? –

+0

Я попытался активировать его таким же образом выше, как и в учебнике, просто заменив имя на подпись из экспорта, и я все еще получил сообщение об ошибке из журнала python, говорит, что он не может вызвать функцию «tuple» что-то ... Я не работаю на том же компьютере Я набираю его, так что все из памяти, если вам нужны какие-то конкретные данные, скажите мне –

+0

Мне кажется, нам нужны детали; здесь мы устраняем неполадки. –

ответ

0

К сожалению, вы не можете сделать это легко и переносимо с помощью ctypes.

ctypes предназначена для вызова функции в DLL, с C совместимых данных типов.

Поскольку для C++ нет standard binary interface, вы должны знать, как компилятор, который генерирует DLL, генерирует код (например, макет класса ...).

Лучшее решение - создать новую DLL, которая использует текущую DLL и обертывает методы как простые c-функции. См. boost.python или SWIG для получения более подробной информации.

+0

Есть ли какое-либо решение для вызова методов в DLL? –

+0

Вы можете обернуть вызовы методов с помощью простых вызовов функций c или использовать инструменты в ответе. – napuzba

+0

думал об этом. Я также видел инструмент под названием SWIG, может ли он делать то, что мне нужно? для вызова методов из ссылки на объект –

Смежные вопросы