loadlibrary



  • wie kann ich eine instanz einer klasse erstellen, die von einer dll exportiert wird, die ich wiederum mit loadlibrary zur laufzeit lade



  • stell in der DLL eine Funktion CreateInstance bereit. Die erstellt dir dann die Instanz.



  • ???
    du verstanden haben was ich gefragt?
    oder ich nich verstanden was du geantwortet?



  • du dumm. ich nix antworten mehr.



  • schau mal in FAQ da steht genug darüber



  • hab die faqs nach loadlibrary abgegrast... da steht aber nirgends was von klassen

    ich sein blind?



  • Du musst in der DLL eine Funktion bereitstellen welche dir die Instanz erstellt.
    Von dieser Instanz gibst du dan einen Zeiger zurück.



  • Leider gar nicht.

    Du kannst dieses Problem aber mit einer Interface Klasse umgehen.
    Diese Interfaceklasse muss in der Dll und der Exe die gleiche sein.
    Alle Methoden der Interfaceklasse sind virtual.
    Dann erstellst du eine Funktion in der Dll, die (anstatt deiner Klasse) die Interfaceklasse zurückgibt.

    z.b. so:

    class IPlugin // die Interfaceklasse
    {
    public:
        IPlugin() {};
        ~IPlugin() {};
        virtual void Aktion1();
        virtual void Aktion2();
    };
    

    Diese Klasse ist in der Dll und der Exe bekannt.
    Folgende Klasse ist jetzt die Klasse, die du exportieren willst:

    class DeineKlasse : public IPlugin
    {
    public:
       DeineKlasse() {};
       ~DeineKlasse() {};
       void Aktion1() { AfxMessageBox("Funktion 1"); }
       void Aktion2() { AfxMessageBox("Funktion 2"); }
    };
    

    Folgende Funktion der Dll liefert die Klasse":

    export "C" IPlugin* __declspec(dllexport) CreateInstance()
    {
       DeineKlasse* pClass = new DeineKlasse;
       return (IPlugin*) pClass;
    }
    

    Folgende Funktion der Dll löscht die Klasse wieder

    export "C" void __declspec(dllexport) DeleteInstance(IPlugin* pClass)
    {
       DeineKlasse* pKlasse = (DeineKlasse*) pClass;   
       delete pKlasse;
    }
    

    Dann kannst du in der Exe Datei den Zeiger auf die Klasse bekommen:

    IPlugin* pPlugin = CreateInstance();
    pPlugin->Aktion1();
    pPlugin->Aktion2();
    DeleteInstance(pPlugin);
    

    Grüße Rapha



  • geil
    thx



  • habs hinbekommen wenn auch n kleines bischen anders
    kennt zufällig einer die unterschiede in der verwendung(falls es welche gibt) zwischen loadlibrary und getprocadress und dlsym und dlopen(linux)



  • die befehle machen das gleiche.


Anmelden zum Antworten