Dll LoadLibrary()



  • 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