[Python-de] Windows-DLLs in Python einbinden

Scherer Ralf RS.2007 at gmx.de
Fr Dez 14 12:00:29 EST 2018


Hallo zusammen,

als nicht Informatiker gibt es Dinge die ich erst einmal nicht verstehe.
Dann wird gesucht und "learning by doing" gemacht. Aber zu bestimmten 
Fragen finde ich einfach keine Antwort, darum dachte ich "Frag mal 
jemand der das gelernt hat". Sollte ich Begriffe wie "Funktion, Methode" 
durcheinander würfeln bitte ich nachsichtige Korrektur ;)

1.
In diversen Quellen wird für Windows-DLLs ein Wrapper geschrieben z.B. 
ftd2xx...

In allen Beispielen die ich bisher gesehen habe wurden die 
DLL-Funktionen als _einzelne_ Funktionen eingebunden und nicht als 
Methode einer Klasse, warum???
Mir erschien es sinnvoll eine DLL mit Ihren Funktionen in eine Klasse zu 
legen.

Gibt es Nachteile, widerspricht das irgendeiner Regel, was gibt es zu 
beachten, ...?

2.
Wie lädt man die Funktionen der DLL korrekt, sauber, elegant?
Begonnen habe ich so:
(Ich habe die Methoden in eine Klasse gelegt siehe 1. darum das "self")

def __init__(self):
	self.__dllObject = windll.LoadLibrary("diomgr")
	self.DIOMGR_Setup = self.__dllObject.DIOMGR_Setup
	self.DIOMGR_Setup.argtypes=[ c_int, c_char_p, POINTER(c_long ),
     POINTER(c_short), POINTER(c_long ), c_char_p ]
...

und dann gab es eine Methode der class DIOMGR:
def Setup(self,ben):
         self.benchName = tool.GetStringBuffer(ben)
         self.DIOMGR_Setup( self.seqCon, self.benchName,
	 	byref(self.resourceID), self.pErrorOccurred,
		self.pErrorCode, self.errorMessage)
...

Dann habe ich folgende "Schreibweise" gefunden:

Setup_Para = par_cao + ((1, "pBench", None),
	(1,"pID",byref(self.RID)), ) + par_err
Setup_Proto = WINFUNCTYPE ( None, *( pro_cao +
	(c_char_p, POINTER(c_long), ) + pro_err ) )

_self._Setup = Setup_Proto (("DIOMGR_Setup", __dllOb), Setup_Para)_

Diese Schreibweise finde ich wegen der "named Parameter" und den Default 
Parametern eleganter, Frage ist: "Macht es Sinn?", wo sind die "Fallstricke"
Was ist besser/korrekter, geht es eleganter? So etwa "dict of para, dict 
of proto, function friss beides => Ergebnis dict of function" und wie 
funktioniert der call?

Ich habe ca. 10-20 DLLs die ich in Python einbinden will und habe keine! 
Probleme damit den Kram komplett, auch mehrfach umzuschreiben (UltraEdit 
ist da eine grosse Hilfe, oder perl, oder...), ich möchte halt wissen 
warum, was bringt es und es muss (sofern das möglich ist) "Bomben fest" 
laufen.

Ein entspanntes WE (sofern das am 14.12. möglich ist)
Ralf


Mehr Informationen über die Mailingliste python-de