LabVIEWForum.de - DLL nur einmal laden -> Aufruf mehrerer Funktionen?

LabVIEWForum.de

Normale Version: DLL nur einmal laden -> Aufruf mehrerer Funktionen?
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hi, ich weiß, der Titel ist vielleicht etwas unglücklich gewählt.

Also ich habe gerade erst mit Labview angefangen und habe leider auch nur mäßige C-Kenntnisse.Sad

Folgendes Problem muss irgendwie gelöst werden:

Ich habe eine DLL um mit einem Messgerät über LAN zu kommunizieren. Diese DLL enthält die u.a. die Funktionen "openConnection (char* ipaddr, int port)", "setConfig (param1, param2, param3)", "startMeasure()", "getData()", "closeConnection()", welche alle zu einer Oberklasse in der DLL gehören.

Diese Funktionen muss ich nun eben in dieser Reihenfolge über LabView aufrufen. Das Einbinden der DLL usw funktioniert alles. Auch die erste Funktion wird problemlos aufgerufen (openConnection) und eine Verbindung mit dem Gerät etabliert. Nur wennich dann die zweite Funktion aufrufen will, welche die Konfiguration an das Gerät senden soll, gibt es probleme. Das Problem ist, dass das Verbindungsobjekt (SOCKET conn) global beim Aufruf von openConnection() gespeichert wird. Auf dieses Objekt müssen jetzt allerdings auch die anderen Funktionen zugreifen können. Aber wie ?

Wenn ich mehrere Knoten mit den unterschiedlichen Funktionen in Labview erstelle, läd er ja jedesmal die dll neu in den Speicher und initialisiert somit auch das Verbindungsobjekt wieder neu, es ist also verloren. Da sind natürlich noch mehr Objekte, die global gespeichert werden. Wenn es nur das eine wäre, hätte ich gesagt, dass man das ja beim Funktionsaufruf wieder an LabView übergeben könnte.

Meine Frage ist, kann man Labview irgendwie sagen, lade die DLL nur einmal in den Speicher? wo man dann die Funktionen nacheinander aufrufen kann, ohne dass irgendwelche Variablen, die von den vorhergehenden Funktionen gesetzt oder verändert wurden, dabei verloren gehen und für die nachfolgenden Funktionen verfügbar ist ?

Oder verstehe ich das ganze Konzept von Labview und DLLs falsch ?Big Grin

Ich hab schon viel probiert, bekomme es aber leider nicht hin.

Der SourceCode der DLL liegt mir vor und kann auch nachträglich manipuliert werden, falls das weiterhilft. Allerdings möchte/darf ich den Quellcode nicht veröffentlichen.
Die DLL wurde mit dem Borland C++ Compiler kompiliert.

Hier noch ein kleiner Auszug aus der Header Datei, damit ihr die Grundstruktur von der Dll sehen könnt:

[code]class DLL_EXPORT BxCntl{
Also grundsätzlich lädt LabVIEW die DLL zwar für jede Call Library Node neu, aber solange ein einziges VI dass eine bestimmte DLL anspricht im Speicher bleibt wird diese DLL nicht wirklich jedesmal neu in den LabVIEW Prozess geladen.

Was Windows macht, ist beim ersten mal die DLLMain Funktion mit DLL_PROCESS_ATTACH aufzurufen und danach nur noch mit DLL_THREAD_ATTACH und einen interenen Referenzcounter für die DLL jeweils mit 1 erhöhen. Du müsstest also für LabVIEW einfach sicher stellen dass die DLL Initialisation nur im DLL_PROZESS_ATTACH Fall ausgeführt wird aber nicht bei DLL_THREAD_ATTACH. Und dann natürlich sicherstellen dass mindestens ein VI dass diese DLL anspricht, immer im Speicher bleibt bis die DLL nicht mehr benötigt wird. Ansonsten wird die DLL natürlich ausgeladen und dann ist beim nächsten Laden eine volle Neuinitialisation fällig.
Referenz-URLs