LabVIEWForum.de - String an DLL übergeben

LabVIEWForum.de

Normale Version: String an DLL übergeben
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3
(27.01.2014 09:04 )Klausenwirt schrieb: [ -> ]Die DLL wurde in C++ geschrieben. Welche Parameter muss ich dann ändern?

Das hängt ganz davon ab wie die Funktion definiert wurde im C++ Code. Ist es eine globale Funktion oder eine Objektmethode?
Die Funktion ist eine globale Funktion. Sie hat zwei numerische Eingangselemente und einen String (char *StringName). Der Ausgabewert ist numerisch.
(29.01.2014 08:27 )Klausenwirt schrieb: [ -> ]Die Funktion ist eine globale Funktion. Sie hat zwei numerische Eingangselemente und einen String (char *StringName). Der Ausgabewert ist numerisch.

Tja, das ist natürlich sehr ungenau definiert. Ist der Prototyp jetzt

int fnCRDLL(int, int, char*);

So wie Du im ersten Post die Call Library Node konfiguriert hast sieht es mehr aus wie:

int fnCRDLL(int, char*, int);

aber wie Du die CLN genau konfiguriert hast entzieht sich meiner Kenntnis genauso, denn Du hast das VI ja nicht beigefügt.

Grundsätzlich gilt für CLN Fragen:

Attachement von sowohl dem VI mit der CLN als auch dem Headerfile mit der Funktionsdeklaration hat am meisten Chancen um soviel möglich Unklarheiten und Ungenauigkeiten zu vermeiden.

Alles andere ist ins Blaue schiessen und hoffen dass es plötzlich ganz magisch funktioniert, was aber noch lange nicht ein Beweis ist dass alles korrekt konfiguriert ist und Du nicht im Hintergrund doch noch irgendwie Speicher kaputtschiesst und damit LabVIEW und Deine Applikation hinterliistig sabotierst.
Es ist int

int fnCRDLL(int, char *, int); (der Zeiger steht vor dem Namen des Strings, falls das wichtig ist)


Mit C++ hab ich selbst noch nicht programmiert. Die DLL-Datei hat ein Kollege erstellt.


[attachment=48313]
(29.01.2014 17:29 )Klausenwirt schrieb: [ -> ]Es ist int

int fnCRDLL(int, char *, int); (der Zeiger steht vor dem Namen des Strings, falls das wichtig ist)


Mit C++ hab ich selbst noch nicht programmiert. Die DLL-Datei hat ein Kollege erstellt.

Bitte "Save for Previous" machen und als 2012 oder früher abspeichern.

Sage Deinem Kollegen mal dass er den Funktionsprototypen so deklariert und die DLL nochmals kompiliert. Dann ist die C++ Namensdekoration zumindest mal weg.

extern "C" __cdecl int fnCRDLL(int start, char *cmd, int cmdLen);
Hier die LV-Version 2010:

[attachment=48315]
Hallo Rolf,

wenn Du noch kein LabVIEW 2013 hast, dann bitte im Profil erwähnen (da steht "ALLE seit 6.0"). Dann kann man das VI gleich auf eine frühere Version zurückspeichern. Danke.

Gruß Markus

(29.01.2014 21:19 )rolfk schrieb: [ -> ]Bitte "Save for Previous" machen und als 2012 oder früher abspeichern.
(30.01.2014 08:31 )Klausenwirt schrieb: [ -> ]Hier die LV-Version 2010:

Also mal serious: int ist nicht short und deshalb auch nicht int16. int == int16 war mal zu Windows 3.1 Zeiten korrekt aber wir sind inzwischen doch beinahe 20 Jahre weiter und sogar in einem anderen Jahrtausend! Das effektiv verwendete Header File würde noch immer viele möglich Irtümer und Annahmen vermeiden.

Und was soll der ganze Klimbims mit new length minus old length? Man nehme x Characters (Bytes) füge noch mal x NULL Bytes an, um dann die LabVIEW CLN da noch einmal ein NULL Byte anfügen zu lassen (ja das macht die weil Du den Parameter als C String definiert hast) und teile der DLL dann mit dass doch nur x Bytes sind. Das ganze Arraygetue kann ganz einfach weg und Du kannst die Länge des ersten StringLength direkt an den dritten Parameter anschliessen.

Und jetzt kommt vielleicht der Clue: Handelt es sich hierbei eventuel um ein serialles Gerät? Könnte es sein dass die DLL oder das Gerät da ganz zufällig ein Carriage Return und/oder Linefeed am Ende erwartet? Den muss man schon explizit in LabVIEW an einen String anfügen, LabVIEW macht das nicht eigenmächtig und sehr zurecht.

Also was liefert Dir die Funktion denn bis jetzt?

Zudem die Deklaration der Funktion gemäss der Konfiguration in der CLN sollte wirklich sein:


extern "C" __cdecl unsigned short fnCRDLL(unsigned short start, char *cmd, unsigned short cmdLen);


(30.01.2014 08:45 )Y-P schrieb: [ -> ]Hallo Rolf,

wenn Du noch kein LabVIEW 2013 hast, dann bitte im Profil erwähnen (da steht "ALLE seit 6.0"). Dann kann man das VI gleich auf eine frühere Version zurückspeichern. Danke.

Gruß Markus

(29.01.2014 21:19 )rolfk schrieb: [ -> ]Bitte "Save for Previous" machen und als 2012 oder früher abspeichern.

2013 habe ich zwar, war aber noch kein zwingender Grund es zu installieren und dann warte ich immer bis SP1 rauskommt.
Zu dem "Klimbis": Ich habe Beitrag #8 umgesetzt und der DLL nur die tatsächliche Länge mitgeteilt.

In diesem SubVi bin ich immer noch am PC, die Daten werden erst viel später an ein serielles Gerät übertragen. Es erwartet auch keinen Carriage Return und/oder Linefeed am Ende.

Die Funktion berechnet einen CRC-Wert des Eingangsstrings. Sie liefert mir auch das richtige Ergebnis, das habe ich schon überprüft. Es hat der Fall, dass bei längeren Tests LabVIEW abstürzt, wenn ich diese DLL verwende.
Offtopic2
Wieso die CRC-Berechnung nicht in LabVIEW umsetzen?

Gruß, Jens
Seiten: 1 2 3
Referenz-URLs