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!
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ß!
Mit einem freundlichen Wort und etwas Gewalt erreicht man viel mehr als nur mit einem freundlichen Wort. [...Marcus zu Lennier, B5]
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>
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
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ß!
Mit einem freundlichen Wort und etwas Gewalt erreicht man viel mehr als nur mit einem freundlichen Wort. [...Marcus zu Lennier, B5]
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.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
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ß!
Mit einem freundlichen Wort und etwas Gewalt erreicht man viel mehr als nur mit einem freundlichen Wort. [...Marcus zu Lennier, B5]
' 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.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Genau so habe ich das auch gemacht. Klasse - kann ja doch was...
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.
Mit einem freundlichen Wort und etwas Gewalt erreicht man viel mehr als nur mit einem freundlichen Wort. [...Marcus zu Lennier, B5]