eine fremde DLL in eigenes projekt einbinden



  • Ich versuche ja die in eine DLL einzufügen.
    Die Funktionen der FTDI-Dll sollen da mit rein, noch andere dabei.
    Aber erstmal die FTDI-DLL ans laufen bekommen...

    In dem header meiner dll steht jetzt

    public ref class Class1{
    public: void geräteanzeigen();
    };
    

    In der cpp der dll habe ich deine zwei Funktionen "geräteanzeigen" und "öffneGerät" zusammengeschmissen und rein kopiert:

    void Class1::geräteanzeigen() {
                          FT_STATUS ftStatus;
    		    char *BufPtrs[3]; // pointer to array of 3 pointers
                char Buffer1[64]; // buffer for product description of first device found
                char Buffer2[64]; // buffer for product description of second device
                DWORD numDevs;
    
                // initialize the array of pointers
                BufPtrs[0] = Buffer1;
                BufPtrs[1] = Buffer2;
                BufPtrs[2] = NULL; // last entry should be NULL
    
                ftStatus = FT_ListDevices(BufPtrs,&numDevs,FT_LIST_ALL|FT_OPEN_BY_DESCRIPTION);
                if (FT_SUCCESS(ftStatus)) {
                    std::string Test;
                    Test=Buffer1;
                    if (Test=="Mein_Gerät") {
                        //ÖffneGerät();
    					FT_HANDLE ftHandle;
                FT_STATUS ftStatus;
                FT_HANDLE ftHandle1;
                ftStatus = FT_OpenEx("Mein_Gerät",FT_OPEN_BY_DESCRIPTION,&ftHandle1);
                ftHandle=ftHandle1;
                if (ftStatus == FT_OK) {
                    FT_SetBaudRate(ftHandle1,9600);
                    FT_SetDataCharacteristics(ftHandle1,FT_BITS_8,FT_STOP_BITS_1,FT_PARITY_NONE);
                    FT_SetFlowControl(ftHandle1,FT_FLOW_NONE,'x','y');
                    // FT_OpenEx OK, device with description "Mein_Gerät" is open
                }
                else {
                    //System::Windows::Forms::MessageBox::Show("Das Mein_Gerät konnte nicht geöffnet werden!","USB",System::Windows::Forms::MessageBoxButtons::OK,System::Windows::Forms::MessageBoxIcon::Error);
                }
                    }
    
                    // FT_ListDevices OK, product descriptions are in Buffer1 and Buffer2, and
                    // numDevs contains the number of devices connected
                }
                else {
                    // FT_ListDevices failed
                }
           };
    

    In dem Forms-Projekt, welches meine DLL nutzen soll, will ich dann die Funktion mit dem Geräte-anzeigen aus der DLL ansprechen, aber bekomme das nicht hin.
    Wegen der Fehlermeldung habe ich das dann mit nem Delegaten (was auch immer das ist) versucht, aber das klappte auch nicht - daher wieder auskommentiert.

    private: System::Void btnCheck_Click(System::Object^  sender, System::EventArgs^  e) {
    				 MeineDLL::Class1::geräteanzeigen();
    				//public delegate void MyDelegate();
    						//MeineDLL::Class1 ^class1 = gcnew MeineDLL::Class1;
    						//MyDelegate ^StaticDelInst = gcnew MyDelegate(class1, &MeineDLL::Class1:geräteanzeigen);
    			 }
    

    Wie kann ich das jetzt in dem Forms-Projekt (da steht der code hier in der .h) ansprechen?

    [EDIT: ] Compilerfehlermeldung: [/EDIT]

    error C2352: 'MeineDLL::Class1::geräteanzeigen': Unzulässiger Aufruf einer nicht statischen Memberfunktion
    


  • Na, Du musst schon eine Instanz Deiner Klasse verwenden!!!



  • Knuddlbaer schrieb:

    Na, Du musst schon eine Instanz Deiner Klasse verwenden!!!

    Ich sag es ungern, aber ich weiß nciht was damit gemeint ist oder wie das geht... 😞



  • ...

    MeineDLL::Class1 ^ meineklasse = gcnew MeineDLL::Class1();
    


  • Hi nibbler

    du musst dir erstmal eine art variable erstellen die deine klasse reprensentiert.

    also
    [cpp]
    MeineDLL::Class1^ gerät1=MeineDLL::Class1();
    //dann geht
    gerät1::geräteanzeigen();
    [cpp]



  • Ja, sorry knuddelbaer, ich hätte erst suchen sollen...

    Habe bei der Suche dann den thread hier gefunden:
    http://www.c-plusplus.net/forum/viewtopic-var-p-is-1229088.html#1229088

    Und daher folgendes probiert:

    MeineDLL::Class1 klasse;
    klasse.geräteanzeigen();
    

    Jetzt lässt sich alles kompilieren.
    Aber scheinbar gehts noch nicht ganz, ich muss das mal debuggen...



  • Ja, sorry knuddelbaer, ich hätte erst suchen sollen...

    Na, geht weniger um das suchen, mehr um das: Da fehlen grundlegende Grundlagen. Ich finde an dieser Stelle die Implementierung einer DLL , am besten noch mit P/Invoke etwas an den Kentnissen vorbei.

    MeineDLL::Class1^ gerät1=MeineDLL::Class1(); 
    //dann geht 
    gerät1::geräteanzeigen();
    

    Das ist auch unsinn.



  • Ja, Grundlagen fehlen mir, da mache ich auch keinen Hehl draus.
    Wenn das soweit erstmal in ner einfachen Form läuft werde ich mir den Code ausdrucken und versuchen das zu verstehen, mir zu erarbeiten.
    Jetzt erstmal nur trockene fehlende Grundlagen lernen hilft mir nicht so richtig, das war schon bei VB der Fall.
    Da habe ich es auch vorgezogen mit dem learning by doing.

    Ich brauche manchmal auch einfach nur ein Stichwort, was mich auf die richtige Lösung bringt.
    So wie der Satz von dir, dass ich eine Instanz einer Klasse verwenden muss.
    Das ist sowas was ich alleine nicht rausbekomme, mit dem Hinweis aber weiter komme.
    War da ja auch der Fall.

    Deshalb hoffe ich ihr seht es einem newbie nach, wenn eine dumme Frage nach der anderen kommt... 🙄



  • Jetzt erstmal nur trockene fehlende Grundlagen lernen hilft mir nicht so richtig, das war schon bei VB der Fall.
    Da habe ich es auch vorgezogen mit dem learning by doing.

    Da is C++ aber die falsche Sprache! Da fängt man leider mit trockenen Grundlagen an. C++/CLI setzt noch einen drauf und die Krönung ist das dann mit Winforms zu vermischen. Eventuell wäre C# die bessere Wahl. Hier kommst Du zwar auch nicht um die Theorie, umgehst aber viele Probleme mit den Forms.



  • Knuddlbaer schrieb:

    Eventuell wäre C# die bessere Wahl. Hier kommst Du zwar auch nicht um die Theorie, umgehst aber viele Probleme mit den Forms.

    Warum umgehe ich da viele Probleme?
    Ich muss eine DLL schreiben, ist da nicht C# etwas fehl am Platze für?



  • Du solltest erst mal die Grundlagen lernen , dann kannst Du Entscheiden in welcher Sprache Du die DLL implementierst.



  • @knuddelbär

    hast recht meine instanz anzulegen war aus den gedächniss raus, im moment schreibe ich ausschließlich hardwarenahes C ohne OS und ich verdränge schnell wie die syntax einer sprache ist wenn ich sie nicht benutze 🙂 das hilft ungemein wenn es darum geht ständig in einer anderen sprache zu schreiben 🙂

    @nibbler
    ein hinweis noch, eine DLL mit .net erzeugt ist nicht gleich einer dll in reinen C++.

    zu den FTDI-Chips gibt es auch Open Source Treiber, vieleicht passen die besser.


Anmelden zum Antworten