c_DLL Wrapper



  • 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



  • Puh, schwere Geburt 😉 Aber es freut mich, daß wir dir weiterhelfen konnten.
    Und ich hoffe, du hast jetzt auch verstanden, was der Sinn eines C-Wrappers ist (und warum man diesen steinigen Weg gehen muß)?!



  • Hallo,

    Der weg ist aufjedenfall nicht so einfach.

    Paar Sachen funktionieren aber nicht alles.
    Was mich in diesem projekt stört ist, dass ich beim DLL_Import gar keine Fehler ausgeworfen wird.Erste wenn ich eine Funktion(die ziemlich verschachtelt ist (in der DLL)) ausführe, bekomme ich eine Fehlermeldung mit der Nummer 1097 sonst gar keine Hinweise was nicht funktioniert.

    Dazu habe ich eine Frage: Soll ich auf irgendwas achten, wenn die Methoden tief verschachtelt sind?

    Ich habe versucht z.B.: die QString Warnung bzw. Exceptionen aufzufangen und durch eine einen try cachen abzufangen.


Anmelden zum Antworten