Plugins, GetProcAdress



  • Hi Jungs,
    ich wollte mein Programm so programmieren das Plugins nachgeladen werden können nur klappt das hier nicht so wie es soll 😞

    Code :

    Programm welches Plugin lädt :

    #include <iostream>
    #include <string>
    
    #ifdef WIN32
    	#include <windows.h>
    #else
    	#include <dlfcn.h>
    #endif
    
    using namespace std;
    
    int main() {
    
    	HINSTANCE dllport = LoadLibrary( "Plugin.dll" );
    	int PluginLoad;
    	int PluginUnLoad;
    
    	if ( dllport == NULL ) {
    		std::cout << "Fehler beim Laden des Plugins!\n" ;
    //		return 1;
    	} else {
    		std::cout << "Plugin geladen...\n\n" ;
    	}
    
    	PluginLoad   = (int) GetProcAddress( dllport , "PluginLoad" );
    	PluginUnLoad =  (int) GetProcAddress( dllport , "PluginUnLoad" );
    
    	if(!PluginLoad) {
    		std::cout << "Funktion PluginLoad() nicht gefunden!\nKein guetiges Plugin!\n";
    //		return 1;
    	}
    
    	if(!PluginUnLoad) {
    		std::cout << "Funktion PluginUnLoad() nicht gefunden!\nKein gueltiges Plugin!\n";
    //		return 1;
    	}
    	std::cout << PluginLoad ;
    	//PluginLoad();
    
    	//
    	//.......
    	//
    	std::cout << PluginUnLoad ;
    	//PluginUnLoad();
    
    	FreeLibrary( dllport );
    	Sleep(10000);
    	return 0;
    }
    

    Plugin DLL Code :

    #include <iostream>
    
    using namespace std;
    
    extern "C" void _init( void ) {
    		std::cout << "Plugin initalisiert (_init) :-)" ;
    }
    
    extern "C" void PluginLoad( void )
    {
    	std::cout << "Plugin geladen :-)" ;
    }
    
    extern "C" void PluginUnLoad( void )
    {
    	std::cout << "Plugin entladen :-)" ;
    }
    

    Fehler gibt es nicht er sagt halt nur das er die Funktion nicht findet

    Compiler ist MSVC++ 6.0 Prof.

    Vielleicht wisst ihr mehr oder habt Tipps oder könnt mir sonst irgendwie weiterhelfen 🙂

    Gruß Patrick 🙄



  • Guten Tag haben sie die Funktionen überhaupt exportiert?



  • bei visual studio is ein tool dabei mit dem du sehen kannst welche funktionen
    in einer dll enthalten sind

    ...\Microsoft Visual Studio\Common\Tools\DEPENDS.EXE

    öffne damit mal deine dll und schau nach ob du die funktionen überhaupt richtig exportiert hast



  • Danke für eure Antworten,
    habe das Tool mal ausprobiert clicke ich nun in der Rechten Spalte auf meine DLL steht dort die Meldung : Error executing "C:\WINDOWS\System32\viewers\quikview.exe"
    "F:\Programme\MSVC\MyProjects\Plugin_Test\Debug\PLUGIN.DLL"

    Ist es also doch ein Export Fehler?

    Hab meinen gesatem Code gepostet vielleicht fällt euch ja doch noch was auf

    Gruß Patrick

    PS : Hab den Fehler in der DLL gefunden es fehlte ein "extern "C" __declspec(dllexport)" dummer Fehler 😕
    Aber Das Tool Depends ist dafür echt gut danke für den Tipp
    Das einzigste was mich noch bedrückt ist das anstatt der Textmeldung im Plugin wilde Zeichenfolgen ausgegeben werden und die Funktion anscheinend nicht aufgerufen wird wie mache ich das richtig ?



  • sie müssen etweder __declspec(export) oder eine .def datei zum exportieren benutzen





  • was verstehst du unter wilden zeichenfolgen die ausgegeben werden?

    versuchs mal so ( hoffe ich bekomm das ausm ff korrekt hin )

    #include <iostream>
    #include <string>
    
    #ifdef WIN32
        #include <windows.h>
    #else
        #include <dlfcn.h>
    #endif
    
    using namespace std;
    typedef void(*PluginLoad)(void);
    typedef void(*PluginUnload)(void);
    
    int main() {
    
        HINSTANCE dllport = LoadLibrary( "Plugin.dll" );
        PluginLoad pLoad;
        PluginUnload pUnload;
    
        if ( dllport == NULL ) {
            std::cout << "Fehler beim Laden des Plugins!\n" ;
    //        return 1;
        } else {
            std::cout << "Plugin geladen...\n\n" ;
        }
    
        pLoad = (PluginLoad) GetProcAddress( dllport , "PluginLoad" );
        pUnload =  (PluginUnload) GetProcAddress( dllport , "PluginUnLoad" );
    
        if(!PluginLoad) {
            std::cout << "Funktion PluginLoad() nicht gefunden!\nKein guetiges Plugin!\n";
    //        return 1;
        }
    
        if(!PluginUnLoad) {
            std::cout << "Funktion PluginUnLoad() nicht gefunden!\nKein gueltiges Plugin!\n";
    //        return 1;
        }
        //PluginLoad aufrufen
        (*pLoad)();
        //
        //.......
        //
    
        //PluginUnLoad aufrufen
        (*pUnload)();
    
        FreeLibrary( dllport );
        Sleep(10000);
        return 0;
    }
    


  • Danke das klappt so ganz gut nur kann ich nicht mehr abfragen ob die Funktion existiert :
    if(!PluginLoad) { ... }
    Da der Typ ja nun gecastet wurde

    Gruß Patrick

    EDIT : Ok hab den Code nur überflogen es muss natürlich so heissen
    if(!pLoad) { ... } dann klappts auch so wie ich mir das vorgestellt habe.

    Danke klappt nun alles, schönes Wochenende 🙂



  • wenns die funktion ned gibt is
    pLoad == NULL


Anmelden zum Antworten