Probleme mit der IP Adresse
Damit ist das `ctypes`-Modul aus der Standardbibliothek gemeint. Zusätzlich zur DLL brauchst Du eine Beschreibung der API der DLL, am besten (auch) als C-Header-Dateien, und grundlegende C-Kenntnisse, zumindest was Datentypen angeht.
Hier ein kurzes ctypes Beispiel (Windows DLL):Ingo hat geschrieben:was meinst du damit ctypes? wie soll das aussehen?
Code: Alles auswählen
from ctypes import *
# kernel32 = windll.kernel32
# msvcrt = cdll.msvcrt
user32 = windll.user32
MessageBoxW = user32.MessageBoxW
MessageBoxW(0, u'A Unicode Message: ÄÖÜäöüß', u'A Unicode Greeter', 0)
http://docs.python.org/library/ctypes.html
Du solltest das `ctypes`-Tutorial aus der Dokumentation mal durcharbeiten.
Und wie gesagt, es sind bis zu einem gewissen Grad C-Kenntnisse nötig, um zu verstehen was da passiert. Man muss die Datentypen kennen und mindestens Struktur- und Funktionsdeklarationen lesen können.
Ist das hier zufällig die Doku zu Deiner DLL: http://www.yokogawa.com/tm/dl/dlsoft/tmctl.txt ?
Und auf Pythonseite sollte man objektorientierte Programmierung drauf haben, um das ordentlich zu kapseln.
Und wie gesagt, es sind bis zu einem gewissen Grad C-Kenntnisse nötig, um zu verstehen was da passiert. Man muss die Datentypen kennen und mindestens Struktur- und Funktionsdeklarationen lesen können.
Ist das hier zufällig die Doku zu Deiner DLL: http://www.yokogawa.com/tm/dl/dlsoft/tmctl.txt ?
Und auf Pythonseite sollte man objektorientierte Programmierung drauf haben, um das ordentlich zu kapseln.
Das kommt darauf an, welche Aufrufkonvention (cdecl oder stdcall) die DLL verwendet. Entweder steht das in der Dokumentation, in der Header-Datei, oder Du musst es einfach ausprobieren. Unter Windows gibt's einen ValueError, wenn man die falsche Variante oder eine falsche Anzahl von Argumenten verwendet. Siehe den Abschnitt über Funktionsaufrufe in der `ctypes`-Dokumenatation.
Das ist beispielhaft der Aufruf von TmcInitialize (ungetestet):Das ließe sich natürlich noch mit argtypes verbessern.
MfG
HWK
Code: Alles auswählen
import ctypes
tmctl = ctypes.windll.tmctl
tmc_initialize = tmctl.TmcInitialize
# Ethernet
wire = ctypes.c_int(4)
adr = ctypes.c_char_p('server name, user name, password')
id_ = ctypes.c_int()
ret = tmc_initialize(wire, adr, ctypes.byref(id_))
print ret, id_.value
MfG
HWK
Oder etwas ausführlicher und mit einer Klasse (natürlich auch ungetestet):
Wenn man das in einer `tmc.py` speichert, sollte man es so benutzen können:
Code: Alles auswählen
from ctypes import byref, cdll, c_char_p, c_int, POINTER
OK = 0
ERROR = 1
WIRE_ETHERNET = 4
TMC_DLL = cdll.tmctl
initialize = TMC_DLL.TmcInitialize
initialize.argtypes = [c_int, c_char_p, POINTER(c_int)]
initialize.restype = c_int
class TMCException(Exception):
pass
class Ethernet(object):
def __init__(self, ip_address, user_name='anonymous', password=''):
self._id = c_int()
address = ','.join([ip_address, user_name, password])
if initialize(WIRE_ETHERNET, address, byref(self._id)) == ERROR:
raise TMCException('cannot initialize.')
@property
def id(self):
return self._id.value
Code: Alles auswählen
import tmc
device = tmc.Ethernet('1.2.3.4', 'guido', 'geheim')
print device.id
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
ctypes gibt es für Python 2.3, für ältere Python-Versionen nicht mehr. Aber 2.2 ist schon uralt, du solltest inzwischen mindestens 2.5 nutzen, wo es schon dabei ist oder gleich 2.6, was aktuell ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
http://www.python.org wäre doch gar nicht abwegig. Alternativ hättest du auch eine Suchmaschine befragen können.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Hallo zusammen
ich habe jetzt python 2.5 und habe auch meine tmctl.dll registriert. also wenn windows hochläuft müsste mein pc diese dll erkennen.
ich habe mal einer der beispiele probiert,
aber er findet fehler in der zeile
tmctl=ctypes.windll.tmctl
er sagt er findet das modul nicht.
Ihr habt auch gesagt, dass ich eine header datei dazu brauche und eine API. Ich habe eine tmctl.h und eine TmctlAPINet.dll soll ich die auch registrieren ? sind das überhaupt die richtigen dateien
folgendes beispiel habe ich probiert:
ich habe jetzt python 2.5 und habe auch meine tmctl.dll registriert. also wenn windows hochläuft müsste mein pc diese dll erkennen.
ich habe mal einer der beispiele probiert,
aber er findet fehler in der zeile
tmctl=ctypes.windll.tmctl
er sagt er findet das modul nicht.
Ihr habt auch gesagt, dass ich eine header datei dazu brauche und eine API. Ich habe eine tmctl.h und eine TmctlAPINet.dll soll ich die auch registrieren ? sind das überhaupt die richtigen dateien
folgendes beispiel habe ich probiert:
Code: Alles auswählen
import ctypes
tmctl = ctypes.windll.tmctl
tmc_initialize = tmctl.TmcInitialize
# Ethernet
wire = ctypes.c_int(4)
adr = ctypes.c_char_p('172.28.12.145, anonymous')
id_ = ctypes.c_int()
ret = tmc_initialize(wire, adr, ctypes.byref(id_))
print ret, id_.value
Was heißt denn registriert? Hast Du die DLL in einem Verzeichnis des path stehen? Kopier die DLL doch einmal in das Verzeichnis Deines Python-Scripts.
Das Test-Beispiel müsste eigentlich auch mit der tmctl.dll allein funktionieren. Die Header-Datei dient eher dazu, die Aufrufkonventionen der Funktionen zu kennen. Die sind aber schon aus der von BlackJack gelinkten Anleitung bekannt.
MfG
HWK
Das Test-Beispiel müsste eigentlich auch mit der tmctl.dll allein funktionieren. Die Header-Datei dient eher dazu, die Aufrufkonventionen der Funktionen zu kennen. Die sind aber schon aus der von BlackJack gelinkten Anleitung bekannt.
MfG
HWK
Habe ich bereits gemacht. trotz des kopierens der dll in meinem path sagt er mir das modul ist nicht vorhanden.
ich erkenn das auch wenn ich bei der zeile:
tmctl = ctypes.windll.tmctl
den zweiten punkt schreibe, dann gibt er mir zur auswahl LoadLibrary und Kernel32 an aber nicht meine tmctl. was mache ich falsch.
ich erkenn das auch wenn ich bei der zeile:
tmctl = ctypes.windll.tmctl
den zweiten punkt schreibe, dann gibt er mir zur auswahl LoadLibrary und Kernel32 an aber nicht meine tmctl. was mache ich falsch.
Zur besseren veranschaulichung hier die fehlermeldung:
Code: Alles auswählen
Traceback (most recent call last):
File "C:\Program Files\Common Files\dSPACE\Python25\lib\site-packages\Pythonwin\pywin\framework\scriptutils.py", line 310, in RunScript
exec codeObject in __main__.__dict__
File "J:\Turbo\ar-VTA\ane\anev\Schin\Pyhton\Programme\Beispiel.py", line 35, in <module>
tmctl = ctypes.windll.tmctl
File "C:\Program Files\Common Files\dSPACE\Python25\Lib\ctypes\__init__.py", line 415, in __getattr__
dll = self._dlltype(name)
File "C:\Program Files\Common Files\dSPACE\Python25\Lib\ctypes\__init__.py", line 340, in __init__
self._handle = _dlopen(self._name, mode)
WindowsError: [Error 126] Das angegebene Modul wurde nicht gefunden