Eine Nichtypische Windows-Dll-Funktion aufrufen mit Python?

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

FYI: Es funktionieren beide Aufrufkonventionen mit FreeBASIC und Python ctypes, sowohl cdecl als auch stdcall.

cdecl:

Code: Alles auswählen

FUNCTION multf CDECL ALIAS "multf" (c AS SINGLE) AS SINGLE EXPORT
    RETURN c*5
END FUNCTION

Code: Alles auswählen

>>> import ctypes
>>> p=ctypes.cdll.LoadLibrary('bla.dll')
>>> p.multf
<_FuncPtr object at 0x00A2EB70>
>>> multf=p.multf
>>> multf.restype=ctypes.c_float
>>> multf(ctypes.c_float(5.1))
25.5
stdcall:

Code: Alles auswählen

FUNCTION multf STDCALL ALIAS "multf" (c AS SINGLE) AS SINGLE EXPORT
    RETURN c*5
END FUNCTION

Code: Alles auswählen

>>> import ctypes
>>> p=ctypes.windll.LoadLibrary('bla.dll')
>>> multf = getattr(p, 'multf@4')
>>> multf.restype = ctypes.c_float
>>> multf(ctypes.c_float(5.1))
25.5
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Na, siehste, dann ist das Freebasic doch nicht so gemein... :D

Im Forum konnte bis jetzt noch keiner sagen wie die Reihenfolge ist beim Aufruf.

Danke.

Gruss
funkheld
User
Beiträge: 258
Registriert: Sonntag 31. Oktober 2010, 09:26

Wie funktionieren da die Zeigerübergabe an die DLL, wo dann evtl Daten übergeben werden in der DLL.

Gruss
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

funkheld hat geschrieben:Wie funktionieren da die Zeigerübergabe an die DLL, wo dann evtl Daten übergeben werden in der DLL.
Verstehe leider den zweiten Teil der Frage nicht. Die Zeiger-Übergabe machst Du in Python z.B. mit ctypes.byref(). Gönn' Dir doch mal die 10min zum Durchlesen der ctypes-Einführung, da steht das alles mit Bsp. erklärt.
funkheld hat geschrieben:Im Forum konnte bis jetzt noch keiner sagen wie die Reihenfolge ist beim Aufruf.
Auf welche Reihenfolge spielst Du an? Reihenfolge der Parameter auf dem Stack?
Antworten