LabVIEWForum.de
Textuelle Ausgabe über DLL in LabView Textbox/Output - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: DLL & externer Code (/Forum-DLL-externer-Code)
+---- Thema: Textuelle Ausgabe über DLL in LabView Textbox/Output (/Thread-Textuelle-Ausgabe-ueber-DLL-in-LabView-Textbox-Output)



Textuelle Ausgabe über DLL in LabView Textbox/Output - Effemfour - 17.11.2010 00:41

Hallo zusammen,

ich habe folgendes Problem:
ich würde gerne einen C-Code und eine GTK-GUI auf eine LabView-GUI umschreiben. Um C-Code in LabView einzubinden, muss ich ja bekanntlich eine DLL erzeugen und diese mittels CLF einbinden.

Nun stehe ich vor dem Problem, dass ich gerne alle textuellen Ausgaben des alten GUI auch mit LabView ausgeben würde, aber nicht genau weiss wie.
Ich würde also gerne in LabView ein Textfeld "Output" (String/char) erzeugen, dass meine im C-Code festgelegten Texte ausgibt.

Anbei ein Beispiel-VI und der Beispiel C-Code. DLL ist angehängt, weil sie 10MB hat und für die Frage nicht unbedingt notwendig ist.

/* Call Library source file */

#ifdef __MINGW32__
#undef WIN32
#undef _WIN32
#undef __WIN32__
#define linux 1
#endif
#include "platdefines.h"
#include "extcode.h"
#include "fundtypes.h"
#ifdef __MINGW32__
#undef linux
#define WIN32 1
#define _WIN32 1
#define __WIN32__ 1
#endif

__declspec (dllexport) int32_t connectTwTesterLabView(int8_t *Connected, char Output[]);

int32_t connectTwTesterLabView(int8_t *Connected, char Output[])
{

*Connected = 1;
Output = "twTester connected";
return 0;

}


Im Beispiel VI würde ich gerne "twTester connected" ausgeben. Gebe aber nur "o" aus (klar wenn man sich das VI anschaut). Wie muss ich den Code und das VI ändern damit ich mit "Output" beliebige Texte, die ich im Code festlege, ausgeben kann?

Es gibt bereits einen ähnlichen Thread, aber hier wurde auch keine richtige Antwort gegeben:
http://www.labviewforum.de/index.php?showtopic=5668

Dankeschön und Gruß
Lukas
Lv85_img


Textuelle Ausgabe über DLL in LabView Textbox/Output - eg - 17.11.2010 00:59

Ich weiß nicht wie du dein CLFN konfiguriert hast, da ich kein LV zur Hand habe. Aber ich würde den Parameter "Output" als ein U8-Array definieren und dann mit Byte Array To String in ein String in LV umwandeln.


Textuelle Ausgabe über DLL in LabView Textbox/Output - Effemfour - 17.11.2010 12:21

Das habe ich nun probiert. Ich bekomme dann aber mit meinem Code keinen Output mehr.


Textuelle Ausgabe über DLL in LabView Textbox/Output - abrissbirne - 17.11.2010 13:02

Versuch mal sowas in der Art.
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>__declspec (dllexport) int32_t connectTwTesterLabView(int8_t *Connected, LStrHandle Output);

int32_t connectTwTesterLabView(int8_t *Connected, LStrHandle Output)
{

*Connected = 1;
char* temp = "twTester connected";
__int32 len = strlen(temp);
(*Output)->cnt = len;
strcpy((*Output)->str, temp);
return 0;

}</div>


Textuelle Ausgabe über DLL in LabView Textbox/Output - Effemfour - 17.11.2010 14:21

Danke!! Damit funktionierts!
Die 2 Underscores vor "int32 len" müssen weggelassen werden und der Code produziert einige Warnings, aber der eigentliche Weg zur Ausgabe ist nun klar!


Textuelle Ausgabe über DLL in LabView Textbox/Output - abrissbirne - 17.11.2010 14:30

' schrieb:Danke!! Damit funktionierts!
Die 2 Underscores vor "int32 len" müssen weggelassen werden und der Code produziert einige Warnings, aber der eigentliche Weg zur Ausgabe ist nun klar!
War auch ein ungetesteter Code. Denke das strcpy eine Warnung ausspuckt, aber immerhin weist du nun wies geht.


Textuelle Ausgabe über DLL in LabView Textbox/Output - rolfk - 24.11.2010 13:46

' schrieb:Versuch mal sowas in der Art.
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>__declspec (dllexport) int32_t connectTwTesterLabView(int8_t *Connected, LStrHandle Output);

int32_t connectTwTesterLabView(int8_t *Connected, LStrHandle Output)
{

*Connected = 1;
char* temp = "twTester connected";
__int32 len = strlen(temp);
(*Output)->cnt = len;
strcpy((*Output)->str, temp);
return 0;

}</div>

WARNUNG: Dieser Code funktioniert nur ohne spurious Crashes wenn man sicher stellt dass das LabVIEW String Handle auf der linken Seite der Call Library Node mit einer Stringkonstanten verbunden ist die minimal strlen(temp) + 1 Character enthält (+1 wegen dem NULL Termination Character der vn strcpy() (für LabVIEW Strings völlig unnötigerweise) mitkopiert wird. Ansonsten ist der Handle nicht lang genug und überschreibt strcpy Speicher der für etwas anderes gebraucht wird und das führt über kurz oder lang zu unerklärlichen und nicht immer leicht reproduzierbaren Crashes.

Besser wäre es um vor dem strcpy() den Handle mittels der LabVIEW Speichermanagerfunktion NumericArrayResize() explizit auf die nötige Grösse zu resizen um sicherzustellen dass da genug Speicher vorhanden ist. Etwas in der Art:

<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>
#include "extcode.h"

__declspec (dllexport) int32_t connectTwTesterLabView(int8_t *Connected, LStrHandle Output);

MgErr connectTwTesterLabView(int8_t *Connected, LStrHandle Output)
{
char* temp = "twTester connected";
int32 len = strlen(temp);
MgErr err = NumericArrayResize(uB, 1, &Output, len);
if (!err)
{
MoveBlock(temp, LStrBuf(*Output), len); /* similar to memcpy since LabVIEW strings can contain embedded 0 chars */
LStrLen(*Output) = len;
*Connected = 1;
}
return err;
}</div>