ich versuche seit Tagen ein Problem zu lösen, jedoch bisher ohne Erfolg und langsam gehen mir die Alternativen aus

Ich habe via
Code: Alles auswählen
from ctypes import CDLL
Vielen Dank im voraus und haltet die Ohren steif

MfG
marvel82
Code: Alles auswählen
from ctypes import CDLL
Code: Alles auswählen
from ctypes import CDLL
...
cdll = CDLL()
cdll.LoadLibrary("erste.dll")
cdll.machirgendwas()
del cdll
...
cdll = CDLL()
cdll.LoadLibrary("zweite.dll")
cdll.machwiederwas()
del cdll
...
cdll = CDLL()
cdll.LoadLibrary("dritte.dll")
cdll.machwas()
del cdll
...
Code: Alles auswählen
#wrapper.py
from ctypes import CDLL, c_wchar_p, c_int, c_bool, c_wchar, POINTER
#==============================================================================
class CmdDLL(object):
"""Wrapper-Klasse für Application-DLL"""
#--------------------------------------------------------------------------
def __init__(self):
#--------------------------------------------------------------------------
"""Konstruktor
"""
self._cmddll = None
#--------------------------------------------------------------------------
def __del__(self):
#--------------------------------------------------------------------------
"""Destruktor
"""
#--------------------------------------------------------------------------
def load_dll(self, appdll=None):
#--------------------------------------------------------------------------
# Application-DLL laden
try:
self._cmddll = CDLL(appdll)
except:
return False
# Typen für Parameterliste und Returnwert festlegen
self._cmddll.initial_update.argtypes = [c_wchar_p, c_wchar_p]
self._cmddll.initial_update.restype = c_bool
self._cmddll.new_document.argtypes = [c_wchar_p]
self._cmddll.new_document.restype = c_bool
self._cmddll.load_document.argtypes = [c_wchar_p]
self._cmddll.load_document.restype = c_bool
self._cmddll.execute_command.argtypes = [c_wchar_p]
self._cmddll.execute_command.restype = c_int
self._cmddll.exists.argtypes = [c_wchar_p]
self._cmddll.exists.restype = c_bool
self._cmddll.get_value.argtypes = [c_wchar_p]
self._cmddll.get_value.restype = c_wchar_p
self._cmddll.set_value.argtypes = [c_wchar_p, c_wchar_p]
self._cmddll.set_value.restype = c_int
self._cmddll.save_document.restype = c_bool
self._cmddll.save_document_as.argtypes = [c_wchar_p]
self._cmddll.save_document_as.restype = c_bool
self._cmddll.close_document.restype = c_bool
self._cmddll.get_last_error.restype = c_wchar_p
self._cmddll.generate_documentation.argtypes = [c_wchar_p]
self._cmddll.generate_documentation.restype = c_bool
# Funktionsnamen für die Funktionen, die einfach an die DLL
# weitergeleitet werden.
self.new_document = self._cmddll.new_document
self.load_document = self._cmddll.load_document
self.execute_command = self._cmddll.execute_command
self.exists = self._cmddll.exists
self.get_value = self._cmddll.get_value
self.set_value = self._cmddll.set_value
self.save_document = self._cmddll.save_document
self.save_document_as = self._cmddll.save_document_as
self.close_document = self._cmddll.close_document
self.get_last_error = self._cmddll.get_last_error
self.generate_documentation = self._cmddll.generate_documentation
return True
Code: Alles auswählen
#------------------------------------------------------------------------------
def startTest(appdll_path, logicdll_file, reference_files_path):
#------------------------------------------------------------------------------
...
# Wrapper erzeugen und Application-DLL laden
cmd = CmdDLL()
ret = cmd.load_dll(appdll_path)
if not ret:
log(u"Fehler: Konnte '%s' nicht laden." %appdll_file)
return
...
Quatsch.marvel82 hat geschrieben:Fakt ist das man mit der aktuellen Implementierung von ctypes keine Möglichkeit hat während der Laufzeit unterschiedliche DLLs zu laden.
Blödsinn.marvel82 hat geschrieben:Abhilfe kann das Modul "multiproccessing" verschaffen, indem man jeden Funktionsaufruf in eigene Prozesse auslagert.
Ja, hoffentlich nimmt das keiner Ernst.marvel82 hat geschrieben:Ich hoffe meinen Erkenntnis bringt euch etwas
Das war auch meine Absicht, denn das ist ja auch völlig an den Haaren herbeigezogen was du da behauptest und dann auch noch eventuell anderen empfiehst. Daher wollte ich das schnell widerlegen, bevor andere auf die Idee kommen, das ernst zu nehmen. Wenn du das nicht empfohlen hättest, dann hätte ich nicht so schnell widersprochen.marvel82 hat geschrieben:konstruktive Antworten wie "Quatsch, Blödsinn, Ja, hoffentlich nimmt das keiner Ernst" sind natürlich sehr hilfreich. Im moment hat dein Post den Wert von "Total überflüssig", ausser das du in den Raum schmeisst das ich falsch liege.
Finde es bischen seltsam dass du deine Aussage so einfach in den Raum stellen darfst, aber ich meine Aussage mit funktionierendem Quellcode untermauern soll. Aber hey, hier bitteschön:marvel82 hat geschrieben:Solltest du jedoch stichhaltige Beweise haben die meine Aussage widerlegen wäre dies anhand eines Beispiels oder Quellcode von Vorteil. So habe ich erstens etwas dazugelernt und zweitens kann jeder User der ein ähnliches Problem hat das Ganze nachvollziehen.
Code: Alles auswählen
import ctypes
from ctypes.util import find_library
libc = ctypes.CDLL(find_library("c"))
libm = ctypes.CDLL(find_library("m"))
libc.printf("String formatting, %d\n", 42)
libm.sqrt.restype = ctypes.c_double
libm.sqrt.argtypes = [ctypes.c_double]
print libm.sqrt(23)
Code: Alles auswählen
String formatting, 42
4.79583152331
Ja, ich nutze GNU/Linux, aber das tut hier kaum was zur Sache, denn so ein Beispiel würde (gegebenfalls mit anderen DLLs) auf Windows laufen. Jetzt bist du mal an der Reihe uns einen Quellcode zu posten, der nicht funktioniert. Weil so kann man nur rumraten und das verschwendet unser aller Zeit.marvel82 hat geschrieben:sobald ich die zweite dll übergebe ist es so als würde er dies einfach ignorieren und weiterhin mit der ersten arbeiten. benutzt du ein linux, ich arbeite auf windoof 7.
Der Code ist weder lauffähig noch annähernd minimal. Wie soll man da das von dir beschriebene Verhalten tesen können?marvel82 hat geschrieben:Den Quellcode hatte ich bereits weiter oben gepostet, also Erzeugung einer Instanz der Wrapper-Klasse in der ctypes verwendet wird. Denke das ist soweit das wichtigste.
Dann sollte es ja noch weniger ein Problem sein, diese zu veröffentlichen. Kannst ja auch den Quellcode veröffentlichen und dazu ggf. Infos zum Kompilieren. Es soll hier ja einige geben, die sich so etwas dann schon selber backen könnenmarvel82 hat geschrieben:Die Dlls die ich übergebe sind von mir selber implementiert worden, also funktionen in c++ mit c schnittstelle für python.