INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

DLL nur einmal laden -> Aufruf mehrerer Funktionen?



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

15.09.2010, 16:38
Beitrag #1

acid111 Offline
LVF-Neueinsteiger


Beiträge: 1
Registriert seit: Sep 2010

8.61
-
de


Deutschland
DLL nur einmal laden -> Aufruf mehrerer Funktionen?
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{
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
16.09.2010, 15:40
Beitrag #2

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
DLL nur einmal laden -> Aufruf mehrerer Funktionen?
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.

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Rückgabezeiger bei DLL-Funktionen TR6 2 6.106 21.12.2011 16:05
Letzter Beitrag: TR6
  CallBack Funktionen in C für LV spamer84 3 7.489 07.05.2008 19:56
Letzter Beitrag: rolfk

Gehe zu: