LabVIEWForum.de
Pointer auf Char-Array / dll Aufruf - 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: Pointer auf Char-Array / dll Aufruf (/Thread-Pointer-auf-Char-Array-dll-Aufruf)



Pointer auf Char-Array / dll Aufruf - ChM - 23.08.2010 13:42

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......


Pointer auf Char-Array / dll Aufruf - IchSelbst - 23.08.2010 14:37

' 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.


Pointer auf Char-Array / dll Aufruf - ChM - 23.08.2010 16:30

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..


Pointer auf Char-Array / dll Aufruf - rolfk - 24.08.2010 01:08

' 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.


Pointer auf Char-Array / dll Aufruf - ChM - 24.08.2010 10:59

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.