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 

LV 7.1, VC++-DLL (VC++2008), string-Übergabe



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!

12.03.2010, 14:39
Beitrag #1

ptillmann Offline
LVF-Neueinsteiger


Beiträge: 1
Registriert seit: Mar 2010

7.1.1
-
de

34246
Deutschland
LV 7.1, VC++-DLL (VC++2008), string-Übergabe
Liebe LeserInnnen,

meine Aufgabe ist es, eine Wrapper-DLL für LV 7.1 zu erstellen. Mein Problem ist die Übergabe von Strings.

Die DLL (VC++ 2008) stellt folgende Funktion bereit:
<blockquote>extern "C" CZPLSDLL_API long WINAPI get_ComponentNames (LPCSTR sCalibFile,
long nExperiment, long nComponent, LPSTR sComponent, long *nComponentSize)
{
<blockquote>[...]
char nstring[100];
[...]

size_t origsize = strlen(nstring);
origsize = min(100,origsize);
memcpy(sComponent,nstring,origsize);
memcpy(sComponent+origsize,"",1);
*nComponentSize = origsize;

return 0;
</blockquote>
}
</blockquote>
Compiler-Einstellungen:
- __stdcall
- /clr (weil gewrappte DLL in C# geschrieben ist)
- /Zp1 (Ausrichten Strukturmember: 1 Byte)


Das Problem:
Wenn ich hinter char nstring[100]; nstring wie folgt deklariere
<blockquote> char nstring[100];
strcpy(nstring,"asdh");
</blockquote>
übernimmt LabVIEW den String korrekt. Wenn ich den String aus meiner gewrappten DLL fülle z.B.
<blockquote> char nstring[100];
String ^str = prd.getString(0);
pin_ptr<const wchar_t> wch = PtrToStringChars(str);
// Convert to a char*
const size_t newsize = 100;
WideCharToMultiByte(CP_ACP, 0, wch, -1, nstring, 100, NULL, NULL);
</blockquote>
(das Ganze liest einen String aus der gemanageden C#-DLL ein, kodiert ihn auf ASCII um und schreibt ihn nach nstring), dann zeigt LabVIEW nur Müll an.

Wenn ich die Wrapper-DLL aus einen VC++-Programm aus aufrufe, kann ich in beiden Varianten der String-Deklaration die Strings korrekt auslesen.

In beiden Varianten der String-Deklaration ist die Stringlänge korrekt, d.h.
<blockquote> sprintf(nstring,"Laenge %d", strlen(nstring));
</blockquote>
liefert die korrekten Werte an LabVIEW und mein VC++-Programm.

Ich habe das Gefühl, es könnte etwas mit UNICODE und ASCII zu tun haben. Nach Lesen des DLL-Tutorials und 3 Jahren Forums-Einträgen, sowie Stunden der alternativen Deklaration (std:string, Cstr, strcpy, memcpy, ...) erlaube ich mir die Frage hier zu stellen.

Ich habe z.Z. keinen Zugriff auf den LV-Code.


Danke

Peter Tillmann
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Nachrichten in diesem Thema
LV 7.1, VC++-DLL (VC++2008), string-Übergabe - ptillmann - 12.03.2010 14:39

Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  DLL mit String Nullpointer Übergabe Hubert R. 5 5.214 25.08.2023 11:43
Letzter Beitrag: rolfk
  Übergabe eines struct arrays an eine DDL und wieder Auslesen SK-AC 4 6.671 12.08.2010 17:01
Letzter Beitrag: rolfk
  Mehrere Cuda DLLs Context-Übergabe grey 2 5.650 17.06.2010 19:50
Letzter Beitrag: rolfk
  Unhandled exception bei Übergabe eines CArrays abrissbirne 8 8.490 25.04.2008 23:31
Letzter Beitrag: abrissbirne
  Übergabe eines C Array abrissbirne 1 4.720 13.04.2008 22:12
Letzter Beitrag: rolfk
  Übergabe von Datenzeiger Cubaner 3 5.627 22.01.2008 13:18
Letzter Beitrag: rolfk

Gehe zu: