Ctype, C++ and CPython zusammen.

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
AdrianMonk
User
Beiträge: 3
Registriert: Donnerstag 28. März 2013, 21:47

Hye,

ich steh zur Zeit wie ein Ochs vorm Berg und versuche eigntlich, was ganz einfaches zu machen. Ich habe eine Dll in C++ und will die Functions einfach nur in Python 2.7 aufrufen. Mein ertser Ansatz war :

import os
dirlist = os.listdir('ForexConnectAPIx64/bin')
from pprint import pprint
pprint(dirlist)
from ctypes import *
myDll = cdll.LoadLibrary ("ForexConnectAPIx64/bin/ForexConnect.dll")

und das Ergebnis ist :

traceback (most recent call File "C:\Users\scaberia3\Python_Projects \FTC\ListDir_Test.py", line 20, in <module>
myDll = cdll.LoadLibrary ("ForexConnectAPIx64/bin/ForexConnect.dll")
File "C:\Python33\lib\ctypes\__init__.py", line 431, in LoadLibrary
return self._dlltype(name)
File "C:\Python33\lib\ctypes\__init__.py", line 353, in __init__
self._handle = _dlopen(self._name, mode)
OSError: [WinError 126] Das angegebene Modul wurde nicht gefunden (Module not found)

['ForexConnect.dll',
'fxmsg.dll',
'gsexpat.dll',
'gslibeay32.dll',
'gsssleay32.dll',
'gstool2.dll',
'gszlib.dll',
'java',
'log4cplus.dll',
'msvcp80.dll',
'msvcr80.dll',
'net',
'pdas.dll']

Dependency Walker hat mir gezeigt, es gitb noch mehr dlls in ForexConnect.dll, also habe ich den PythonPfad geaendert :

dllpath = os.path.abspath('ForexConnectAPIx64/bin')
os.environ['PATH'] += os.pathsep + dllpath
myDLL = CDLL('ForexConnect.dll')

Jetzt gibt es zwar keine Fehlermeldung mehr, aber ein dir(myDLL) ergibt auch nichts.
Print type(mydll) zeigt <class 'ctypes.CDLL'>.

Was mache ich falsch oder wie kann ich die Classes aufrufen ?


Schonmal vielen Dank fuer Eure Hilfe.
Adrian
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo AdrianMonk,

was erwartest Du denn was dir(myDLL) ergibt?
Mit ctypes kann man, wie der Name schon sagt, C-Datentypen erzeugen (also int, char, char* usw.) um damit C-Funktionen in DLLs aufzurufen, deren Argumente ctypes vorher bekannt gemacht wurden.
Prinzipiell sind damit auch Funktionen von C++ ansprechbar, aber nur mit großem Aufwand.

Grüße
Sirius
AdrianMonk
User
Beiträge: 3
Registriert: Donnerstag 28. März 2013, 21:47

Hey,

vielleicht bin ich etwas naiv hier.
Das Problem ist, das die DLL ForexConnect.dll ne lange Liste von Classen in C++ enthaelt, auf die ich zugreifen muss, weil die Connection zum Server, Update der Daten etc uebernehmen.

Das mit dem Dir habe ich einfach nur gemacht, um zu sehen, ob irgendwas da ist. Wenn ich Dich richtig verstehe,
dann kann ich das eigentlich so vergessen, richtig ?

Gruesse
AdrianMonk
Faule Socke
User
Beiträge: 11
Registriert: Mittwoch 27. März 2013, 10:57

Die coolste Lösung wäre sicher, die DLL zu reverseengineeren, aber wohl nicht die sauberste :) Du kannst mit boost::python einen Wrapper schreiben um die DLL gescheit aus Python heraus ansprechen zu können. Dazu musst du allerdings C++ können.
AdrianMonk
User
Beiträge: 3
Registriert: Donnerstag 28. März 2013, 21:47

Hallo und danke fuer die Antworten. Wie ich lerne kann ich das wohl vergessen :-(

Dumme Frage, es gibt das auch als .Net API. Hat jemand Erfahrung mit PythonNet ? IronPython ist leider keine Option, da ich die GUI in wxPython habe.
Wie wuerde ich da eine DLL einbinden ?

Danke.

AdrianMonk
Antworten