2016-08-17 3 views
0

Ich habe hier ein Tutorial über den Aufruf von Funktionen aus einer c/C++ DLL, das Beispiel wird hier von der official tutorial geschrieben.Aufruf von Methoden aus C/C++ DLL mit 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) 
>>> 

Dieses Beispiel funktioniert, wenn die Funktion extern ist, aber nehmen wir an, ich habe einen Verweis auf ein Objekt, und ich möchte mit params von diesem Objekt eine Funktion aufzurufen, wie kann ich das tun?

Ich habe das Protokoll aller Funktionssignaturen von 'Dumpbin - Exports' gesehen, und ich habe versucht, den vollen Namen der Funktion zu verwenden, und es hat immer noch nicht funktioniert.

Alle anderen Ideen wären gesegnet.

+0

Woher wissen Sie, dass es nicht funktioniert hat? –

+0

Ich versuchte es auf die gleiche Weise oben als das Tutorial zu aktivieren, nur den Namen mit einer Signatur aus den Exporten zu ersetzen, und ich erhielt immer noch einen Fehler von Python-Protokoll, sagt es nicht die Funktion, 'Tupel' etwas nennen ... Ich arbeite nicht auf dem gleichen Computer ich tippe es, so ist es alles aus dem Speicher, wenn Sie bestimmte Daten benötigen, sagen Sie mir –

+0

Ich denke, wir brauchen Details; Wir machen hier eine Fehlerbehebung. –

Antwort

0

Leider können Sie das nicht einfach und in portabler Weise mit ctypes tun.

ctypes soll Funktionen in DLLs mit C kompatible Datentypen nennen.

Da es keine standard binary interface für C++ gibt, sollten Sie wissen, wie der Compiler, der die DLL generiert, den Code generiert (d. H. Klassenlayout ...).

Eine bessere Lösung besteht darin, eine neue DLL zu erstellen, die die aktuelle DLL verwendet und die Methoden als einfache c-Funktionen umschließt. Weitere Informationen finden Sie unter boost.python oder SWIG.

+0

Gibt es eine Lösung für den Aufruf von Methoden in DLLs? –

+0

Sie können die Methodenaufrufe mit einfachen c-Funktionsaufrufen umbrechen oder die Tools in der Antwort verwenden. – napuzba

+0

dachte darüber nach .. Ich sah auch ein Werkzeug namens SWIG, kann es tun, was ich brauche? Aufruf von Methoden aus einer Objektreferenz –