LabVIEW

cancel
Showing results for 
Search instead for 
Did you mean: 

Kann eine Initialisierungsfunktion in einer DLL im Speicher gehalten werden?

Hallo zusammen,
 
zu meinem Problem.
Ich rufe 2 Call Libary Function Node (gleiche DLL) nacheinander auf. Eine Funktion dieser DLL (erstellt in C++) macht eine Initialisierung, welcher COM-Port verwendet werden soll und schreibt den COM-Port in den Speicherbereich dieser DLL. Wenn nun eine weitere Funktion dieser DLL aufgerufen wird versucht diese Funktion den COM-Port aus dem Speicher auszulesen. Dies Funktioniert leider nicht. Ich denke, dass der Speicherbereich nach Aufruf der DLL wieder freigegeben wird und somit die Initialisierungsdaten verloren gehen.
 
Stimmt diese Vermutung, dass nach Aufruf einer DLL mit Call Libary Function Node immer die komplette DLL abgeschlossen und der Speicher wieder freigegeben wird?
 
Gibt es eine Möglichkeit (in LabVIEW 7.1) die Daten welche von einer DLL in den Speicher geschrieben werden, permanent zu erhalten,
oder muss die Initialisierung in jeder Funktion der DLL eingebunden werden?
 
Vielen Dank!
0 Kudos
Message 1 of 14
(3,827 Views)

Hi there

LV creates a single instance of the DLL, so you can store data inside the dll over several calls to different functions. see attached example for usage of a dll global variable and a static variable. some dialog boxes will be shown, see the putget.cpp to see why.

If you can't save data over several function calls i presume there's a bug in the dll. Let us see some code to help you out.

 

Best regards
chris

CL(A)Dly bending G-Force with LabVIEW

famous last words: "oh my god, it is full of stars!"
Message 2 of 14
(3,817 Views)
Die dll bleibt im Speicher bis LabView beendet wird (stoppen der VI alleine reicht nicht). Das Problem muss wo anders liegen.

Gruss, Felix
0 Kudos
Message 3 of 14
(3,816 Views)

Danke für Eure Hilfe.

Ich habe jetzt herausgefunden, dass ich noch ein ganz anderes Problem habe.

Wenn ich mein vi in LabVIEW 7.1 ablaufen lasse, bekomme ich falsche Rückgabewerte aus meiner DLL-Funktionen, aber wenn ich eine EXE erzeuge und diese anschließend ablaufen lasse, funktioniert alles einwandfrei. Woran kann dies liegen?

Vielen Dank!

0 Kudos
Message 4 of 14
(3,788 Views)


ralfw wrote:

Danke für Eure Hilfe.

Ich habe jetzt herausgefunden, dass ich noch ein ganz anderes Problem habe.

Wenn ich mein vi in LabVIEW 7.1 ablaufen lasse, bekomme ich falsche Rückgabewerte aus meiner DLL-Funktionen, aber wenn ich eine EXE erzeuge und diese anschließend ablaufen lasse, funktioniert alles einwandfrei. Woran kann dies liegen?


Mit diesen Informationen lässt sich nicht viel beginnen. Es handelt sich garantiert nicht um eine DLL hoher Qualität, aber das ist schon fast das Einizge was sich dazu sagen lässt. Wie hast Du denn den Aufruf konfguriert: reentrant oder UI Thread?
 
Könnte sein dass Deine DLL ganz seriöse Probleme damit hat um multithreading (reentrant) aufgerufen zu werden. Die (dumme) Verwendung von Konfigurationsparametern in einer globalen Variablen lässt diesen Schluss sehr gut zu und wird wohl nicht das Einizge sein was in globalen Variablen hineingepfuscht wurde. Globale Variablen ob in LabVIEW oder in einer DLL sind fast immer "evil"!
 
Rolf Kalbermatter
 


Message Edited by rolfk on 11-13-2007 10:14 AM
Rolf Kalbermatter  My Blog
DEMO, Electronic and Mechanical Support department, room 36.LB00.390
0 Kudos
Message 5 of 14
(3,775 Views)

Hallo Rolf,

 

die DLL ist zuvor in einem C++ Programm eingebunden gewesen – hat gut funktioniert. Jetzt soll mit LabVIEW ein neues Programm geschrieben und dieselbe DLL eingebunden werden. DLL in C++ erstellt.

Die DLL komuniziert mit einem Gerät über die serielle Schnittstelle. (z.B. Gerät stoppen / starten)

Ich habe die DLL nicht geschrieben und weiß somit leider auch nicht, wie diese genau aufgebaut ist. Die meisten Funktionen in der DLL besitzen keine Übergabewerte. Die Funktionen melden lediglich einen booleschen Wert zurück, ob die Funktionen richtig abgearbeitet wurden.

 

Die Parameter „reentrant“ und „UI Thread“ der Call Libary Function Node habe ich auch schon verändert – immer das gleiche Ergebnis. In LabView meldet die Funktion einen Fehler zurück und beim Ausführen der EXE-Anwendung ist alles in Ordnung - das Gerät geht in Stop bzw. Start.

 

Ist es besser die benötigten Parameter jeder Funktion direkt zu übergeben?

 

Ich werde versuchen mit dem Entwickler der DLL zu reden.

Vielen Dank!

 

Ralf

 

0 Kudos
Message 6 of 14
(3,755 Views)
In welcher Form werden die Werte (falsch) zurückgegeben? Ich finde die Schnittstelle LV-dll immer recht kritisch...
Sind die Daten der Ausgang von einem Call Library Node, oder ein 'vor-allocated buffer'?

Kurzer Screenshot der entsprechenden Stelle (Call Library Node) wäre praktisch.

Gruss, Felix
0 Kudos
Message 7 of 14
(3,751 Views)

Hallo Felix,

ich verwende "Call Libary Function Node" und ich bekomme nur eine 0 (Fehler) oder 1 (OK) von der DLL-Funktion zurück. Bei der Funktion Initialisierung wird die verwendete Com Schnittstelle in eine globale Variable geschrieben. Die anderen Funktionen greifen anschließend auf diese globale Variable zu. In LabVIEW bekomme ich von allen DLL-Funktionen eine 0 zurück und bei der EXE-Anwendung immer eine 1, und das Gerät startet bzw. stoppt.

Ich verstehe nicht, dass es bei der EXE-Anwendung funktioniert und in LabVIEW nicht.

Gruss, Ralf 

0 Kudos
Message 8 of 14
(3,732 Views)
Hi Ralf,

hast Du mit den Calling Conventions (stdcall vs. C) schon herumexperimentiert? Ansonsten, der Rückgabewert ist in LV auf U8, wie ist das hier mit anderen Datentypen (U16, U32, I32)?

Felix
0 Kudos
Message 9 of 14
(3,721 Views)

Hallo Felix,

hab schon mit allen Parametern der Call Libary Funktion gespielt - kein Erfolg.

Wenn ich einen anderen Datentyp verwende bekomme ich undefinierte Werte aus den anderen Bytes.

Ich habe schon mit einem Kollegen geredet, welcher öfters DLL's eingebunden hat - er kann sich das auch nicht erklären, wieso es nur mit der EXE-Anwendung läuft.

Ich versuche jetzt den Entwickler der DLL zu kontaktieren, möglicherweise kann man die globalen Variablen herausnehmen - vielleicht kommen wir dann der Sache auf den Grund.

 

Danke!

 

Gruss, Ralf 

0 Kudos
Message 10 of 14
(3,709 Views)