LabVIEWForum.de - Dll einbinden, mehrere Headerdateien...

LabVIEWForum.de

Normale Version: Dll einbinden, mehrere Headerdateien...
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo!

Mal ein Schuss ins Blaue...

Ich habe eine DLL, die ich gerne einbinden möchte. Wenn ich im Assi die DLL auswähle, und den gleichnamigen Header (.h) hinzufüge, werden von 15 Funktionen nur 10 erkannt.

Meine Vermutung:
Da noch mehr Header mitgeliefert wurden, sind die fehlenden Deklarationen etc. bestimmt darin zu finden.

Aber:
Ich kann im Assi doch nur eine Header angeben....

Habt Ihr da eine Idee?

Gruß!
<div align="left">Hallo,

habe auch schon mal ein wenig mit dem DLL-Assistenten herumgespielt.

Meine bisherige Erfahrung: den Rest musst du von Hand machen. Wird wohl noch 1 oder 2 LV-Versionen dauern, bis der Assistent noch ein wenig mehr kann. Ich empfehle dir auch, alle erstellten VI's noch mal selber anzuschauen, manchmal sind die Datei-Typen, die der Assitent auswählt, nicht völlig richtig (z.B. int statt uint).

MfG, Jens</div>
Oh!

Oke - das geht also von Hand...

Das wäre sie gewesen. Mal shen, ob ich das hinbekomme..

Also denne - Danke und Gruß!

Edit: Datei angehängt
Hallo zusammen nochmal!

Ich habe die Geschichte mit dem Assi aufgegeben - und das ist gut so! Lol Mann will ja schliesslich auch wissen, was da so vor sich geht.

Jetzt stoße ich aber an die Grenzen meiner LV - zu - C - Datentypwandlung.

Genauer gesagt:
Mir geht es darum, die Deklaration von Variablen für die Funktionsübergabeparameter und Rückgabetypen herauszufinden. Als

Funktionsprototyp:
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>int fn_Test(char szZeichen[260])</div>

Was ist nun der Übergabeparameter in LV? Wird z.B. der String in LV "ZeroTerminated"? Oder muß ich wirklich aus einem String erst ein Array, in welchem jedes Element ein Zeichen darstellt und abschliessend von Hand eine "ZeroTremination" einfügen?

Vielleicht könnt Ihr mir auf die Sprünge helfen..
Gruß!
' schrieb:
Code:
int fn_Test(char szZeichen[260])
Was ist nun der Übergabeparameter in LV?
So wie das da steht, also ohne * nach CHAR und mit einer Zahl (hier 260) in den eckigen Klammern würde ich ja sagen, dass die Daten direkt über den Stack übergeben werden müssen. Das hieße aber, dass 260 Zeichen auf den Stack kopiert werden müssten. Das aber kann ich mir nun gar nicht vorstellen. Jeder normale Programmierer übergibt Strings als Pointer. Nun hab ich aber auch schon gesehen, dass eine Pointer-Übergabe so deklariert wird: "(char StrValue[])" - also immernoch ohne *, aber auch ohne Zahl in den Klammern. Vielleicht soll ja die 260 nur dazu dienen, anzuzeigen, dass der Bereich 260 Zeichen groß sein muss.

Eigentlich sollte es dann ein PChar sein. Das ist ein Pointer auf einen Datenbereich der Basisbreite ein Byte, der mit einem #0 endet.

In LV würdest du als Übergabeparameter schon einen String nehmen können. Ich würde aus Sicherheitsgründen manuell dafür sorgen, dass der String durch ein #0 beenedet wird (Str=Str+#0); Das Zugriffsverfahren wäre dann "Zeiger auf Wert".

[quote]Oder muß ich wirklich aus einem String erst ein Array, in welchem jedes Element ein Zeichen darstellt und abschliessend von Hand eine "ZeroTremination" einfügen?[quote]Ob du einen String hast oder ein Array - für das Zugriffsverfahren "Zeiger auf Wert" ist das egal.
Hallo und Danke!

Mit dem Funktionsprototyp hast Du Recht: Es handelt sich natürlich um eine Begrenzung der Zeichen.

Was ich aber nicht verstehe ist:

Als C Programmierer würde ich der Funktion den Pointer auf das erste Zeichen übergeben - also den Namen des Arrays XXX[y]:

char XXX[250] = {A,B,C};

Rückgabewert = fn_Test(XXX);

Damit muß es dann gehen. Wie mache ich das dann in LV? Da es sich bei dieser Funktion um eine Pfadangabe handelt, werde ich im VI also aus einem Pfad einen String machen. Und was dann?

- Ein Array, in dem jedes Zeichen des Strings ein eigenes Feld in einem Bytearray bekommt?
- Einen String in dem jedes Zeichen ein eigenes Feld bekommt?
- Einen String übergeben lassen?

In beiden Fällen sollte doch aber ein "Pointer auf" übergeben werden, welcher der Einstellungen ist das dann tatsächlich?

Hmmm, ich bin da gerade echt unbeholfen... Hoffe Ihr könnt noch mehr für mich tun - zumal da ja dann in anderen Funktionen noch Strukturen etc. ebenfalls übergeben werden müssen...

Gruß!
' schrieb:der Funktion den Pointer auf das erste Zeichen übergeben - also den Namen des Arrays XXX[y]
Im Prinzip ist das richtig.

Zitat:Da es sich bei dieser Funktion um eine Pfadangabe handelt, werde ich im VI also aus einem Pfad einen String machen.
Jawohl.

Zitat:Und was dann?
Dann erzeugst du einen DLL-Knoten, wählst die DLL-Datei, wählst das richtige Aufruf-Format (stdcall oder c - Achtung: sehr wichtig; wenn falsch, dann AccessViolation) und wählst die Funktion fn_Test. Dann den Rückgabeparameter als I32. Für den einen Parameter XXX wählst du den Typ String und dann das String-Format "C-String-Zeiger" - das ist dann ein PChar, also ein Zeiger auf die Daten (für Mindestgröße musst du glaub ich nichts angeben).

An den DLL-Knoten kann du dann ein String-Bedienelement anschließen. LV beendet Strings automatisch mit einem Nuller-Zeichen.
Hallo!

Genau so habe ich das auch gemacht. Klasse - kann ja doch was...Wink
Bei der Mindestgröße habe ich mal eine max. Feldlänge eingegeben, nicht dass LV dann irgandwann Arbeitsspeicher umkopieren muss, weil die Größe nicht an einem Stück da ist...

Danke! ich melde mich wegen den Strukturen dann wieder.
Referenz-URLs