Hallo,
ich habe in C++ eine DLL geschrieben. Jetzt tritt folgendes Problem auf: Wenn ich einen CLR-Knoten ins Diagramm einfüge und unter Einstellungen die DLL angebe, erhalte ich eine Auswahl der Exportierten Funktionen und kann mit der DLL arbeiten. Stelle ich dagegen den Pfad programmatisch zur Verfügung, kann ich die Funktionen nicht mehr auswählen und LabVIEW strürzt ab. Was könnte der Fehler sein?
Gruß Thomas
Wenn Du den Pfad programmatisch angibst bekommt die Call Library Node diesen erst zur Laufzeit zu sehen. Sie kann zur Editierzeit also gar nicht wissen welche DLL Du laden möchtest und deshalb auch gar nicht in dieser noch unbekannten DLL schauen was für Funktionen verfügbar sind, um sie Dir in der Selection Box zur Auswahl anzubieten.
Warum es abstürzt? Hast Du denn einen Namen eingeführt? Die Selectionbox erlaubt das Auswählen aus einer Liste WENN die DLL zur Editierzeit bekannt ist, aber man kann da genau so gut einen Namen hineinschreiben (was bei programmatischem Libraryauswahl absolut unumgänglich ist).
Und natürlich muss die Funktion die da steht von der DLL auch exportiert werden (was aber einen Laufzeitfehler geben sollte wenn dem nicht so wäre) und die genannte Funktion in der von Dir angegebenen DLL muss natürlich auch ganz genau stimmen qua Parameter, Datentypen und Calling Convention. Last but not least kann das Problem in der Configuration und Deiner Implementation der Call Library Node liegen. Nicht alle Fehler in dieser Hinsicht brauchen immer gleich zu crashen, obwohl sie es beinahe immer früher oder später tun, aber dieses später kann durchaus auch Stunden nach der verhängnisvollen Tat sein.
Hallo,
also die Parameter stimmen eigentlich alle. Wie gesagt, das Programm stürzt nicht ab wenn ich die dll direkt eingebe. Wenn ich es über ein wire tue, dann stürzt es ab. Ich habe in das Feld mit den Funktionen die gewünschte Funktion direkt eingegeben und mehrfach auf Rechtschreibfehler überprüft. Etwas merkwürdig finde ich das schon.
Exportiert werden die Funktionen übrigens.
Also: Haken bei Specify path on diagram, per Hand in Function name "Versionsnummer" ohne die "" geschrieben. Thread auf Run in any thread gestellt und Calling convention auf "C" gesetzt. Im prototype steht jetzt: "CStr Versionsnummer(void);" Im Reiter Parameters den Return Parameter in Versionsnummer umbenannt, als Typ String angegeben und im Format C String Pointer ausgewählt.... ist das der Knackpunkt? Soweit ich weiß liefert die Funktion einen String, aber keinen Zeiger....
Die Funktion ist in der cpp Datei so angelegt:
Test_API string Versionsnummer(string)
{
version="1.00.00.00";
return(version);
}
wobei ich "#include <string> und namespace std benutze. In der Headerdatei steht dann
extern
Test_API void Versionsnummer(void);
Ich habe bestimmt eine Kleinigkeit übersehen, aber ich komme nicht drauf...
Gruß Thomas
' schrieb:Die Funktion ist in der cpp Datei so angelegt:
Test_API string Versionsnummer(string)
{
version="1.00.00.00";
return(version);
}
wobei ich "#include <string> und namespace std benutze. In der Headerdatei steht dann
Also die Funktion nimmt einen string parameter und gibt einen string Parameter zurück!!! Warum konfigurierst Du denn die Funktion in der Call Library Node mit einer leeren (void) Parameterliste (CStr Versionsnummer(void))?
Zudem der C++ Datentyp "string" ist ein Objekt kein C string pointer. LabVIEW kann und wird niemals C++ Objekte in der Call Library Node unterstützen, da das Binaryinterface dazu compilerabhängig ist.
Du wirst schon explicit ein char* zurückgeben müssen aber meine praktischen C++ Kenntnisse hören hier schon auf. Eventuel ist es genug den Returnparameter der Funktion entsprechend zu deklarieren und macht Dein lieber C++ Compiler die Konversion vom string Objekt in den C string Pointer automatisch im return statement.