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 

Pointer auf Char-Array / dll Aufruf



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!

23.08.2010, 13:42
Beitrag #1

ChM Offline
LVF-Neueinsteiger


Beiträge: 3
Registriert seit: Aug 2010

8.6
1996
de


Deutschland
Pointer auf Char-Array / dll Aufruf
Hallo zusammen,

ich verzweifle gerade an einer Einbindung einer Funktion aus einer DLL.
Nicht die ganze Funkion bringt mich am Rande des Wahnsinns, sonder ein Parameter.
Die Funktion ist wohl in C++ geschrieben und leider habe ich den Quelltext nicht.

Funktion sieht so aus:

unsigned long init(
const char *com_port,
unsigned long com_rate,
char **error_buffer,
unsigned char *dbg_buffer,
unsigned long dbg_buf_len
);

In der DLL wird der Speicher für den Error-Buffer festgelegt und übergibt mir dann eine Fehlermeldung.

Ich bekomme das mit dem error_buffer einfach nicht gebacken.

Vielleicht kann mir jemand helfen?
Wie muss ich in Labview den Aufrufknoten einstellen, daß dies funtkioniert?
Geht das überhaupt?

Danke schon mal......
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
23.08.2010, 14:37
Beitrag #2

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.687
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Pointer auf Char-Array / dll Aufruf
' schrieb:In der DLL wird der Speicher für den Error-Buffer festgelegt und übergibt mir dann eine Fehlermeldung.
In deinem Falle könnte folgendes funktionieren.

char** übergibt dir einen Pointer auf einen Speicher, der den Pointer auf den Fehlerpuffer enthält. Es gibt ein spezielles VI, MoveBlock, das dein Problem vielleicht lösen könnte.

Deklariere im DLL-Knoten den Parameter als "U32, Wert" (also ein ganz normaler Rückgabewert). Dieser Wert entspricht (und das weist ber nur du, nicht das Programm) dem Pointer auf den Pointer. Diesen Wert gibst du auf den MoveBlock und lässt dir 4 Zeichen (Pointergröße unter Win32) geben. Aus diesen 4 Zeichen machst du eine Zahl, die dann dem Pointer auf den Errorpuffer entspricht. Diese neue Zahl gibt du wieder auf den MoveBlock und lässt dir so den Errorpuffer geben.

Zwei Probleme treten auf. Erstens: das SubVI mit MoveBlock muss du selbst mal suchen.

Zweitens: Woher weis der zweite MoveBlock, wie groß der Errorpuffer ist? Im allerschlimmsten Falle musst du MoveBlock sooft aufrufen, bis ein Null-Byte (Ende eines char*) zurück gegeben wird.

Ich empfehle, vor jedem Start des Programms alle Sources zu speichern. Mit Pointer zu arbeiten ist immer kritisch. Lass dir vor dem Implementieren eines MoveBlocks den Pointerwert anzeigen - zum Kucken, ob er einen sinnvollen Wert enthält.

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
23.08.2010, 16:30
Beitrag #3

ChM Offline
LVF-Neueinsteiger


Beiträge: 3
Registriert seit: Aug 2010

8.6
1996
de


Deutschland
Pointer auf Char-Array / dll Aufruf
Danke, ich habs hinbekommen.

Nicht ganz so wie vorgschlagen, aber folgendes hat geholfen.

Übergabe als u32 aber über den Aufruftyp´"an Typ anpassen" mit "Handles durch Wert". Wenn ich direkt u32 mache bekomme ich eine Fehler von CIN (1097).
Den übergebenen Wert dann mit der Funktion "MoveBlock" aulesen wobei der Parameter DST von mir als Array of U8 deklariert wurde und danach einfach in String umwandeln. Ende des Strings ist dann der erste 0-Wert (wie in C).

Ich danke nochmals..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
24.08.2010, 01:08 (Dieser Beitrag wurde zuletzt bearbeitet: 24.08.2010 23:02 von rolfk.)
Beitrag #4

rolfk Offline
LVF-Guru
*****


Beiträge: 2.302
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
Pointer auf Char-Array / dll Aufruf
' schrieb:Danke, ich habs hinbekommen.

Nicht ganz so wie vorgschlagen, aber folgendes hat geholfen.

Übergabe als u32 aber über den Aufruftyp´"an Typ anpassen" mit "Handles durch Wert". Wenn ich direkt u32 mache bekomme ich eine Fehler von CIN (1097).
Den übergebenen Wert dann mit der Funktion "MoveBlock" aulesen wobei der Parameter DST von mir als Array of U8 deklariert wurde und danach einfach in String umwandeln. Ende des Strings ist dann der erste 0-Wert (wie in C).

Ich danke nochmals..

Als U32 aber Übergabe als Pointer statt als Wert erreichts Du dasselbe aber es ist etwas deutlicher was Du machst. Damit kann man den ersten MoveBlock mit 4 Bytes von IchSelbst aussparen. Und nicht vergessen, dieser PointerBuffer wurde von Deiner Funktion angelegt, muss also mit der richtigen Funktion dealloziert werden.

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
24.08.2010, 10:59
Beitrag #5

ChM Offline
LVF-Neueinsteiger


Beiträge: 3
Registriert seit: Aug 2010

8.6
1996
de


Deutschland
Pointer auf Char-Array / dll Aufruf
Für das Deallozieren ist eine Funktion in der Dll vohanden.
Immer wenn ein Fehler auftritt muss danach der Speicher freigegeben werden, sonst enstehen ja memory-leaks.
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
  Datenübergabe an DLL Pointer to Pointer Reiling 2 8.647 02.02.2018 10:59
Letzter Beitrag: Reiling
  Absturz durch unzulässige Pointer VS_03 3 9.110 28.10.2016 18:32
Letzter Beitrag: VS_03
  dll mit Pointer auf komplexe Struktur einbinden Wedgewood 11 15.019 27.04.2014 23:44
Letzter Beitrag: Wedgewood
  Pointer auf Array mit Labview übertragen und darstellen lupus022 35 26.667 19.07.2013 10:53
Letzter Beitrag: lupus022
  VC++ 6.0 DLL ins Labview--Ist es möglich output type as char*? Danyang 1 4.430 11.06.2013 10:44
Letzter Beitrag: rolfk
  Pointer und MoveBlock OXO 4 7.411 03.06.2013 16:31
Letzter Beitrag: OXO

Gehe zu: