Plugins, GetProcAdress
-
Hi Jungs,
ich wollte mein Programm so programmieren das Plugins nachgeladen werden können nur klappt das hier nicht so wie es sollCode :
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 wurdeGruß 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