Dll LoadLibrary()



  • Ich habe wie Snudo vor mit meinem Plugin System ein String rein verarbeiten und dan n geb ich nen String zurück

    Original habe ich in meinem Sourcecode folgendes

    webserverdlg.h

    typedef int (*PFUNC)(void);  //fürs Plugin-System
    

    webserverdlg.cpp

    // ************ for debug only ......
      if(m_dwa2.count("plug1.plx")==TRUE) 
      {
    	//Find a function and use it
        PFUNC pFunc = (PFUNC)GetProcAddress((HINSTANCE)m_dwa2["plug1.plx"], _T("fnPlug1")); 
    	if (pFunc != NULL)
        {
          int n = pFunc();
          CString answer ;
          answer.Format("Das Plugin antwortet mit %d", n);
          MessageBox(answer);
        }
      }
    //PLUGIN System ENDE.............................
    

    das würde ich abändern zu

    webserverdlg.h

    typedef CString (*PFUNC)(CString master);  //fürs Plugin-System
    

    webserverdlg.cpp

    // ************ for debug only ......
      if(m_dwa2.count("plug1.plx")==TRUE) 
      {
    	//Find a function and use it
        PFUNC pFunc = (PFUNC) GetProcAddress((HINSTANCE)m_dwa2["plug1.plx"], _T("fnPlug1"));
    	if (pFunc != NULL)
        {
          CString parameter="viewtopic.html";
          CString answer = pFunc(parameter);
          MessageBox(answer);
        }
    

    }

    und die dll selbst hätte ich folgende änderungen vorgenommen
    wobei mich vorallem interessiert warum bei eurem code "fnPlug1" in Klammern steht und bei mir nicht

    plug1.h

    extern "C" PLUG1_API int fnPlug1(void);
    

    plug1.cpp

    PLUG1_API int fnPlug1(void)
    

    abgeändert zu

    plug1.h

    extern "C" PLUG1_API CString (fnPlug1)(CString master);
    

    plug1.cpp

    PLUG1_API CString (fnPlug1)(CString master)
    


  • Und wo ist jetzt die Frage?
    PS: Du musst dann aber die shared CRT/MFC verwenden!



  • also funktionieren tats der originalcode schon original bekamm ich bei der dll einfach ne zahl zurück um zu sehen obs läuft

    wollte erstens einfach wissen ob ich das so richtig verstanden hatte

    weil ich z.b. nicht verstehe warum bei mir

    extern "C" PLUG1_API int fnPlug1(void);
    

    und bei euch

    extern "C" PLUG1_API int (fnPlug1)(void);
    

    stehen würde

    geschweige denn wo bei mir das "_T" in

    PFUNC pFunc = (PFUNC)GetProcAddress((HINSTANCE)m_dwa2["plug1.plx"], _T("fnPlug1"));
    

    herkommt

    und aufgrund der unterschiede wollt ich fragen obs richtig ist kann es leider nicht testen da der code noch von der Sourcecodeverwaltung gesperrt ist weil nen Kumpel mir hilft nen anderes Problem zu finden



  • Skippy schrieb:

    weil ich z.b. nicht verstehe warum bei mir

    extern "C" PLUG1_API int fnPlug1(void);
    

    und bei euch

    extern "C" PLUG1_API int (fnPlug1)(void);
    

    stehen würde

    Da hast Du was falsch verstanden...
    Das was Du hier machst ist eine Funktion in die DLL exportieren.
    Wenn Du diese Funktion nun via GetProcAddress verwenden willst, dann benötigst Du noch eine separate deklaration der Funktion (also in meinem Beispiel mit "typedef ...").

    Skippy schrieb:

    geschweige denn wo bei mir das "_T" in

    PFUNC pFunc = (PFUNC)GetProcAddress((HINSTANCE)m_dwa2["plug1.plx"], _T("fnPlug1"));
    

    herkommt

    Das _T wird dazu verwendet dass man mit dem gleichen Source einmal für ANSI und auch für UNICODE compilieren kann. Es ist einfach ein Makro entweder auf *nix* oder auf L(x). Drück doch einfach mal F12, dann siehst Du es...



  • ich hab das Plugin nun Versucht zu ändern und zu Kompilieren

    extern "C" PLUG1_API CString fnPlug1(CString master);

    aber ich bekomme jetzt fehlermeldungen

    error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'fnPlug1'
    error C2146: Syntaxfehler: Fehlendes ')' vor Bezeichner 'master'
    error C2501: 'fnPlug1': Fehlende Speicherklasse oder Typspezifizierer

    könnt des was mit CString zu tun haben fehlt vielleicht nen include?

    habe nur die #include <windows.h> ioncludiert und wenn ja welche fehlt denn oder was muss andernfalls ändern



  • Irgendwas von den MFC Headern brauchst Du natürlich noch!
    Z.B afx.h (hab die Hilfe aber auf meinem PDA gerade nicht zur Hand)



  • hast recht hab das grad eben gelesen die beispiel dll verwendet keine MFC

    also klappt das gar net oder??

    hab aber noch ein anderes beispiel was die MFC verwendet mal sehen obs klappt



  • wenn du MFC-KLassen benutzt, vergiss nicht das Makro in die Exportfunktionen am Anfang zu schreiben/kopieren, was nötig ist. Steht in dem Kommentar der CPP-Datei zur DLL, wwnn du ein DLL-Projekt mit dem Assistenten anlegst.



  • Vielen Dank Jochen, das war es.

    Ein Problem hab ich aber noch. Die exportierten Funktionen haben laut Dependency Walker alle den richtigen Namen bis auf meine CALLBACK funktionen.
    Alle diese Funtkionen haben ein "_" vor dem Namen. Kann ich den auch weg bekommen ?



  • Hm also Klassen Exportieren geht auch. Ich mach das in meinem 3D Editor so um die 3D Engine vom Editor zu trennen.

    Mal ne kleine Erklärung ie ich das machen:

    Ich erstelle eine LIB und eine DLL.
    In die Lib kommt eine Interfaceklasse. In die DLL kommt eine von der Interfaceklasse abgeleitete Version.

    Nun exportiere ich zwei Funktionen aus der DLL die ich immer gleich nenne. In einer Funktion instanziere ich Dynamisch ein Objekt der abgeleiteten Klasse und gib ein gecasteten Zeiger in den Typ der Interfaceklasse zurück. Dadurch erhalte ich dann den Zugriff.

    Die zweite Funktion löscht einfach die Instanz des Objekts wieder.



  • Hier ging es IMHO ja nicht darum Klassen via DLL/LIB zu exportieren, und dann die LIB zu linken, sondern das ganze via LoadLibrary/GetProcAddress zu machen.

    Eine Lösung hierfür ist (wobei ich keine solche Lösungen mit C++ empfehle):
    http://www.codeproject.com/dll/LateLoad.asp



  • 😮 wie kann man was so einfaches nur so kompliziert darstellen^^ 😃


Anmelden zum Antworten