c_DLL Wrapper
-
Derjenige der die C++-Lib erstellt hat, hat leider kein "const QString&" (bzw. gleich "QString") als Parameter genommen, sondern eine nicht-konstante Referenz (Grund wahrscheinlich Unwissenheit!).
Du mußt also beim Aufruf selber eine Variable vom Typ QString erstellen und diese dann übergeben:
QString str(strFileSettings); Lib* lib = new Lib(an_aus, str);
PS: Dein Header ist immer noch falsch, denn C unterstützt keine Default-Parameter (const char *strFileSettings = setting). Wenn dann müßtest du zwei verschiedene Funktionen (mit unterschiedlichem Namen) dafür anbieten (und die eine ruft die andere dann mit "file.ini" als 2. Parameter auf)!
Und C (zumindestens C89) kennt kein "bool", daher habe ich extra ein #define dafür angelegt (als int).
Noch ein letztes Mal: teste den Header mit einem C-Compiler, sonst wird LabView beim Aufruf der Funktionen falsche Parameter übergeben (und dies ist Undefined Behaviour (UB) und könnte deinen Rechner formatieren oder "Dämonen aus der Nase fliegen lassen"...).PPS: Was ist denn jetzt überhaupt "DLL_Lib" bei dir? Du verwendest den extra deklarierten "Lib_Wrapper" ja gar nicht!!!
Das wird eine harte Lernkurve für dich - ich hoffe aber, daß du so langsam dahinterkommst?!
-
Th69 schrieb:
Derjenige der die C++-Lib erstellt hat, hat leider kein "const QString&" (bzw. gleich "QString") als Parameter genommen, sondern eine nicht-konstante Referenz (Grund wahrscheinlich Unwissenheit!).
Ahh...
Jetzt rächt sich, dass ich nur von der fehlerhaften Konvertierung getriggert worden bin, ohne den Thread gelesen zu haben.Ich dachte der TE hätte die Kontrolle über die Konstruktoren.
-
Hallo Furble Wurble,
jeder C++-Profi würde diese Schnittstelle noch mal neu erstellen, aber für "Samuel_gast" ist das wohl ein paar Hürden zu hoch (wenn er schon bei der C-Schnittstelle nicht so recht vorankommt).
-
Th69 schrieb:
jeder C++-Profi würde diese Schnittstelle noch mal neu erstellen[...]
Obacht!
Wir sind hier im C Forum.
Das ist das natürliche Habitat von Wutz. Hier ist "C++-Profi" ein Widerspruch in sich!
-
Ich plädiere für ein C/C++-Forum -> duck und weg...
-
Th69 schrieb:
PPS:
-
Was ist denn jetzt überhaupt "DLL_Lib" bei dir?
-
Du verwendest den extra deklarierten "Lib_Wrapper" ja gar nicht!!!
-
Das wird eine harte Lernkurve für dich - ich hoffe aber, daß du so langsam dahinterkommst?!
@
- meine DLL_Lib ist: Lib_Wrapper
- Warum nicht? und was ist das ?
DLLIMPORT DLL_Lib create_DLL_Lib(bool an_ous, const char *strFileSettings) { Lib_Wrapper lib_Wrapper; Lib* lib = new Lib(an_aus,QString::QString (strFileSettings)); // <-- hier noch passende Parameter angeben //Lib* lib = new Lib(an_aus,strFileSettings); lib_Wrapper.Lib = static_cast<void *>(lib); return lib_Wrapper; }
- Es ist nicht so einfach wie ich gedacht habe.
Aber dir (@Th69 ) noch mal 1000 Dank
-
-
Hallo,
Ich muss leider nochmals stören
meine Header File sieht so aus:#define BOOL int #define DLLIMPORT __declspec (dllexport) #ifdef __cplusplus extern "C" { /* using a C++ compiler */ #endif // Wrapper Lib_Wrapper typedef struct Lib_Wrapper { void *Lib }Lib_Wrapper; const char *strFileSettings = "file.ini"; DLLIMPORT Lib_Wrapper create_DLL_Lib(BOOL an_aus, const char &strFileSettings ); DLLIMPORT void destory_DLL_LibWrapper(Lib_Wrapper* LV_ref_DLL_Lib); DLLIMPORT const char* DLL_LibGetVersion(Lib_Wrapper* LV_ref); .... #ifdef __cplusplus } #endif #endif
Source Code:
DLLIMPORT Lib_Wrapper create_DLL_Lib(BOOL an_ous, const char &strFileSettings)// ToDo QString ist kein C Datentyp { Lib_Wrapper lib_Wrapper; Lib* lib = new Lib(an_aus,QString::QString (strFileSettings)); //Lib* lib = new Lib(an_aus,strFileSettings); lib_Wrapper.Lib = static_cast<void *>(lib); return lib_Wrapper; } DLLIMPORT void destory_DLL_LibWrapper(Lib_Wrapper* LV_ref_DLL_Lib) { delete LV_ref_DLL_Lib; } DLLIMPORT const char* DLL_LibGetVersion(Lib_Wrapper* LV_ref) { // Hier weiss es nicht wie ich diese Methode implementiere :confused: }
-
Das wird so nichts.
Du solltest strukturiert vorgehen, und nicht immer wild hin und herprobieren.
So arbeitet man durchaus auch in anderen Sprachen als C.#ifdef __cplusplus #define DLLIMPORT __declspec (dllexport) #else #define DLLIMPORT #endif typedef struct Lib_Wrapper { void *lib; }Lib_Wrapper; #ifdef __cplusplus extern "C" { /* using a C++ compiler */ #endif DLLIMPORT Lib_Wrapper create_DLL_Lib (int); DLLIMPORT void destory_DLL_LibWrapper(Lib_Wrapper); DLLIMPORT const char* DLL_LibGetVersion (Lib_Wrapper); #ifdef __cplusplus } #endif
Lib_Wrapper create_DLL_Lib(int an_aus) { Lib_Wrapper x = {static_cast<void*>(new Lib(an_aus))}; return x; } void destory_DLL_LibWrapper(Lib_Wrapper wrapper) { Lib *lib = static_cast<Lib*>(wrapper.lib); delete lib; } const char* DLL_LibGetVersion(Lib_Wrapper wrapper) { Lib *lib = static_cast<Lib*>(wrapper.lib); return lib->LibGetVersion().toUtf8().constData(); } ...
Im Aufrufkontext ist der Wrapper dann eine ganz einfache struct-Variable und KEIN Zeiger.
-
Hallo alle zusammen,
danke an alle die mich geholfen haben.
Ich habe noch einen Frage:
Es hat fast alle geklappt nur habe Problem mittypedef enum test{first,second} t_order;
Kann es sein, dass Labview Probleme hat enumeration Type?
Danke in Voraus
-
Guten morgen Zusammen,
da einen grossen Teil der Funktionen in C_DLL_Wrapper(Header) als übergabe Parameter von
typedef enum
haben, wird immer von Labview seite beim DLL Importieren eine Fehlermeldung geworfen.
Die Funktionen, die ihre übergabe Parameter als "typedef enum" definiert sind, werden von Labview beim importieren nicht erkannt.
z.B:typedef enum test{first,second} t_order;
die Funktion dazu ist:
DLLIMPORT test getTestEnumeratorType(t_order order );
Fehlermeldung:
t_order ist nicht bekannt
-
Nimm statt t_order int und statt der Abfragen
if( order == first ) if( order == second ) dann if( order == 0 ) if( order == 1 )
-
Intern im C++ Code sollte man aber weiterhin die Enums verwenden (wie bei den anderen Datentypen halt auch wrappen).
-
auf die C++ seite habe ich eigentlich kein Problem.
Problem ist in Header File.
Labview scheint, dass es kein Enumeration Type kennt ?
z.B bei diese Deklation in Header file:typedef enum test{first,second} t_order;
und die deklarion der Test Funktion " getTestEnumeratorType(t_order order )".
DLLIMPORT test getTestEnumeratorType(t_order order );
Die Implementierung der Testfunktion in diesem Fall ist:
DLLIMPORT test getTestEnumeratorType(t_order order) { if(order == first) return first; else return second; }
dieses Testfunktion ist sinnlos aber es dient nur darum der Labview zu testn, ob es allgemein Problem mit Labview hat.
Mein Problem ist wie deklariere ich meine Funktionen, die eine Enumerationtype als übergabe Parameter haben.
-
Das hat Wutz doch schon geschrieben:
Wutz schrieb:
Nimm statt t_order int ...
DLLIMPORT int getTestEnumeratorType(int order) { t_order order_enum = static_cast<t_order>(order); if(order_enum == first) return first; else return second; }
-
Ist zwar häßlich, dürfte hierbei aber ausreichen:
#ifdef __cplusplus typedef enum test{first,second} t_order; DLLIMPORT t_order getTestEnumeratorType(t_order order ); #else DLLIMPORT int getTestEnumeratorType(int order); #endif
-
Da bin ich mir nicht so sicher, da in C++ enums nur so groß sind wie der maximale Bereich (d.h. evtl. nur 1 Byte anstatt sizeof(int)) - evtl. passt dann die Parameterübergabe nicht korrekt.
-
Th69 schrieb:
Das hat Wutz doch schon geschrieben:
Wutz schrieb:
Nimm statt t_order int ...
DLLIMPORT int getTestEnumeratorType(int order) { t_order order_enum = static_cast<t_order>(order); if(order_enum == first) return first; else return second; }
Wie du mir geschrieben hast, geht es nicht.
Vielleicht du meinst so:DLLIMPORT test getTestEnumeratorType(int order) { t_order order_enum = static_cast<t_order>(order); if(order_enum == first) return first; else return second; }
oder?
-
Nein, ich meinte schon 'int' auch als Rückgabewert. Aber evtl. mußt du dann noch beim 'return' casten:
DLLIMPORT int getTestEnumeratorType(int order) { t_order order_enum = static_cast<t_order>(order); if(order_enum == first) return static_cast<int>(first); else return static_cast<int>(second); }
(aber laut http://ideone.com/3T2VrS braucht man das nicht - und ich kenne es auch nur in die andere Richtung int -> enum so)
Du hast das aber auch jetzt mit einem C++-Compiler probiert (ich frage, weil du deinen Code in C-Tags gepackt hast)?
-
Th69 schrieb:
Du hast das aber auch jetzt mit einem C++-Compiler probiert (ich frage, weil du deinen Code in C-Tags gepackt hast)?
Ja ich habe es mit einen C++ Compiler bzw. VS 2008
-
Hallo,
ich möchte hier bei meinen Lob für das ganzen Team ausprechen.
Durch eure Hilfe bin ziemlich weiter gekommen nochmal herzlichen Dank