LabVIEWForum.de
DLL: String übergeben und wieder ausgeben..woran scheiterts? - 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: DLL: String übergeben und wieder ausgeben..woran scheiterts? (/Thread-DLL-String-uebergeben-und-wieder-ausgeben-woran-scheiterts)



DLL: String übergeben und wieder ausgeben..woran scheiterts? - angori - 06.10.2009 07:54

Hallo miteinander

Ich möchte eine DLL schreiben um Strings schneller als mit dem Subvi 'Conc. Strings' zu verbinden.
Um dies zu erreichen wollte ich zuerst der DLL einen String übergeben und wieder ausgeben, doch leider klappt nicht einmal das.

Den Code meiner DLL sieht so aus:

<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>__declspec (dllexport) void summieren(void *LVHandle, char *ixx)
{
int ixxlength = strlen (ixx);

/* Size LabVIEW handle to the correct size */
DSSetHandleSize(LVHandle, ixxlength + 5);

/* Copy the string size to the LabVIEW handle */
**(int32 **)LVHandle = ixxlength ;

/* Copy the string to the LabVIEW handle */
sprintf((*(char **)LVHandle)+4,"%s",ixx);

}

</div>

Aber es kommt nichts raus.

Return type: String: c String Pointer
arg1: String: C String Pointer

Arbeite mit LV 8.6 und Visual C++ 2008 Express Edition

Bin euch für jeden Tipp dankbar.

Danke.

Gruss
angori


DLL: String übergeben und wieder ausgeben..woran scheiterts? - rolfk - 06.10.2009 10:16

1) LabVIEW ist nicht inherent langsam. Strings immer wieder aneineanderfügen schon. Das hat mit der Art des Memorymanagements zu tun. Ich bezweifle dass Du mit externem C Code sehr viel verbessern kannst, da Du bei vielen Stringconcatenations halt nun einmal oft den Speicher reallozieren musst, oder Du musst von Beginn an mit einem Riesenblock arbeiten in den Du dann die Information nach und nach hineinfüllst. Die grösste Zeit geht nämlich im DSSetHandleSize() oder Anverwandten wie NumericArrayResize() verloren und solange Du das nicht prinzipiel eliminierst wirst Du auch mit C Programmierung keinerlei Zeitgewinn machen.

Grundsätzlich lässt sich aber das Allozieren eines grossen Blockes ganz zu Beginn und dann das Einfüllen der entsprechenden SubDaten in diese, auch ganz in LabVIEW machen. Shift Register in einer Loop und Arrayoperationen sind das Schlüsselwort hinzu. Ist zwar nicht mehr so einfaches LabVIEW Programmieren aber in C machst Du ja auch nichts anderes und schnelleres Programmieren davon in C geht meist auch nicht, ausser Du bist ein richtiger C Crack der fehlerfreien C Source Code noch im Schlaf träumt.

2) Du lässt nicht sehen wie Du diese Funktion in LabVIEW aufrufst. Der void *LVHandle Parameter is auch unschön. Dies sollte LStrHandle LVHandle sein oder LStrHandle *LVHandle, je nachdem ob Du den Parameter als LabVIEW Stringhandle "passed as Handle" oder "passed as Pointer to Handle" konfiguriert hast. Wenn Du es als Pointer zu einem Handle konfigurierst, musst Du aber damit Rechnung tragen, dass LabVIEW Dir einen NULL Pointer reinschickt, wenn es ein leeres Handle betrifft. NumericArrayResize() kann damit umgheen. DSSetHandleSize() aber nicht da Du kein nicht existentes Handle resizen kannst. Dann musst Du explicit auf ein NULL Handle testen und in dem Fall DSNewHandle() benützen.

Dein Beispiel sollte besser so ausschauen, auch wenn dies nicht sinnvoll ist:

[code]#include "extcode.h"

__declspec (dllexport) MgErr summieren(LStrHandle *LVHandle, char *ixx)
{