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: String übergeben und wieder ausgeben..woran scheiterts?



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!

06.10.2009, 07:54 (Dieser Beitrag wurde zuletzt bearbeitet: 06.10.2009 07:55 von angori.)
Beitrag #1

angori Offline
LVF-Neueinsteiger


Beiträge: 9
Registriert seit: Aug 2008

8.00
-
de

48520
Deutschland
DLL: String übergeben und wieder ausgeben..woran scheiterts?
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
06.10.2009, 10:16 (Dieser Beitrag wurde zuletzt bearbeitet: 06.10.2009 10:22 von rolfk.)
Beitrag #2

rolfk Offline
LVF-Guru
*****


Beiträge: 2.306
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
DLL: String übergeben und wieder ausgeben..woran scheiterts?
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)
{

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
  String an DLL übergeben Klausenwirt 22 20.721 31.01.2014 14:40
Letzter Beitrag: Klausenwirt

Gehe zu: