Fehler bei DLL wrappen

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
zhinek20
User
Beiträge: 10
Registriert: Mittwoch 15. Dezember 2010, 09:19

Hallo,
ich programmiere mit python 2.6 in der Eclipse Oberfläche und möchte eine dll wrappen mit Hilfe von Ctypes.
Hier erstmal mein Code:

Code: Alles auswählen

usbcan_lib_path = util.find_library("USBCAN32")                     # Speicherort der USBCAN Bibliothek
#usbcan_lib_path="D:\Program Files (x86)\SYSTEC-electronic\USB-CANmodul Utility Disk\Lib\USBCAN32"
if sys.platform == "win32":
    lib = c.WinDLL(usbcan_lib_path)                                # USBCAN32 Bib. einbinden, falls Windows- Sytem vorliegt
else:
    lib = c.CDLL(usbcan_lib_path)                                  # USBCAN32 Bib. einbinden falls Linux-System
Nach dem Ausführen des oberen Codes, wird der Fehler zurückgegeben:

Code: Alles auswählen

Traceback (most recent call last):
  File "E:\eclipse\workspace\AnalyseApp_CAN Bus\src\USB_CAN\USB_CAN_Fkt.py", line 22, in <module>
    lib = c.WinDLL(usbcan_lib_path)                                # USBCAN32 Bib. einbinden, falls Windows- Sytem vorliegt
  File "D:\Program Files (x86)\Python2.6\lib\ctypes\__init__.py", line 353, in __init__
    self._handle = _dlopen(self._name, mode)
TypeError: expected string or Unicode object, NoneType found
Meine erste Vermutung war, dass die Funktion find_library() die dll nicht findet, so habe ich den Code geändert und den Pfad der USBCAN.dll der WinDLL() manuell übergeben (siehe Code):

Code: Alles auswählen

usbcan_lib_path="D:\Program Files (x86)\SYSTEC-electronic\USB-CANmodul Utility Disk\Lib\USBCAN32"
if sys.platform == "win32":
    lib = c.WinDLL(usbcan_lib_path)                                # USBCAN32 Bib. einbinden, falls Windows-Sytem vorliegt
else:
    lib = c.CDLL(usbcan_lib_path)                                  # USBCAN32 Bib. einbinden falls Linux-System
Nach Ausführung dieses Codes bekomme ich diesen Fehler und weiß dann auch nicht mehr weiter:

Code: Alles auswählen

Traceback (most recent call last):
  File "E:\eclipse\workspace\AnalyseApp_CAN Bus\src\USB_CAN\USB_CAN_Fkt.py", line 22, in <module>
    lib = c.WinDLL(usbcan_lib_path)                                # USBCAN32 Bib. einbinden, falls Windows- Sytem vorliegt
  File "D:\Program Files (x86)\Python2.6\lib\ctypes\__init__.py", line 353, in __init__
    self._handle = _dlopen(self._name, mode)
WindowsError: [Error 193] %1 ist keine zulässige Win32-Anwendung
Hat jemand diesen Fehler schon gehabt oder weiß jemand was ich Falsch mache?
lunar

Du musst den Pfad zur Bibliothek angeben, nicht lediglich den Pfad zum Verzeichnis, indem die Bibliothek gespeichert ist.
zhinek20
User
Beiträge: 10
Registriert: Mittwoch 15. Dezember 2010, 09:19

lunar hat geschrieben:Du musst den Pfad zur Bibliothek angeben, nicht lediglich den Pfad zum Verzeichnis, indem die Bibliothek gespeichert ist.
Danke für deine Antwort, aber

Code: Alles auswählen

usbcan_lib_path="D:\Program Files (x86)\SYSTEC-electronic\USB-CANmodul Utility Disk\Lib\USBCAN32"
das ist der Pfad zur Bibliothek. "USBCAN32" ist die dll.
Wenn ich den Pfad zur dll übergebe wird ein Fehler ausgegeben: keine win32 Anwendung (siehe auch oben Quellcode).
BlackJack

@zhinek20: Die DLL heisst tatsächlich ``USBCAN32`` und nicht vielleicht doch ``USBCAN32.DLL``!?
zhinek20
User
Beiträge: 10
Registriert: Mittwoch 15. Dezember 2010, 09:19

@BlackJack Ja die DLL heißt "USBCAN32". Hab es auch mit den Endungen .dll und .DLL versucht, es geht aber nicht.

Ich muss sagen, dass ich die dll- USBCAN32 schon erfolgreich vewendet habe (mit dem oben gepostetem Programmiercode), aber nach dem ich auf meinem Rechner Windows neu installiert habe und alle Treiber und alle Programme neu Installiert habe, kann ich die Bibliothek nicht mehr einbinden.
Ich versetehe nicht wieso der Fehler: "keine zulässige win32-Anwendung" ausgegeben wird, vorher gabs keine Probleme.
Benutzeravatar
snafu
User
Beiträge: 6750
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Du verwendest aber jetzt nicht nur den alten Code, sondern hast auch geprüft, ob die Datei tatsächlich dort liegt, oder? ;)
BlackJack

@zhinek20: Ich kann mir nur schwer vorstellen, dass jemand unter Windows eine DLL ohne Dateiendung speichert. Das würde zum Beispiel schon mal erklären warum `find_library()` die nicht finden kann. Wenn es das "früher" getan hat, dann hast Du da jetzt eine andere Bibliothek würde ich sagen.

Edit: Ich habe mir mal diese Utility-Disk heruntergeladen und bei mir heisst die Datei ``USBCAN32.dll``:

Code: Alles auswählen

bj@s8n:~/.wine/drive_c/Program Files/SYSTEC-electronic/USB-CANmodul Utility Disk/Lib$ ls -l
total 184
-rw-r--r-- 1 bj bj 129624 2011-02-15 11:03 USBCAN32.dll
-rw-r--r-- 1 bj bj  14252 2011-02-15 11:03 USBCAN32.lib
-rw-r--r-- 1 bj bj    550 2010-11-10 09:18 USBCAN32.reg
-rw-r--r-- 1 bj bj   1632 2009-09-16 13:25 USBCANCP.reg
Wenn Du Die nicht hast, dann ist da wohl bei der Installation etwas schief gelaufen.
zhinek20
User
Beiträge: 10
Registriert: Mittwoch 15. Dezember 2010, 09:19

@snafu:
Ja ich habe geprüft ob die Datei dort liegt und sie ist auch dort abgelegt;)

@BlackJack:
Bei der Einbindung in Windows kann man die Dateiendungen weglassen(habe ich so gelesen). Aber egal, ich hab es ja auch mit Dateiendungen (.dll und .DLL) versucht und es geht trotzdem nicht.

Die Dateien sind auch alle unter dem Pfad: "D:\Program Files (x86)\SYSTEC-electronic\USB-CANmodul Utility Disk\Lib" abgespeichert. Ich hab ein Screenshot von dem Ordner gemacht wo die Dateien liegen.
http://www.myimg.de/?img=screendc990.png

Was komisch ist, dass dieser Fehler ausgegeben wird:

Code: Alles auswählen

WindowsError: [Error 193] %1 ist keine zulässige Win32-Anwendung
Benutzeravatar
/me
User
Beiträge: 3557
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Nur so als spontane Idee:
Bei der Registrierungsdatei wird keine Dateinamens-Erweiterung angezeigt und trotzdem weiß Windows um welchen Dateityp es sich handelt. Das spricht dafür, dass die Anzeige von bekannten Dateiendungen ausgeschaltet ist. Warum wird bei der DLL trotzdem die Dateiendung angezeigt? Die heißt nicht zufällig in Wirklichkeit "USBCAN32.dll.dll"?
Antworten