Hallo,
habe ein Programm geschrieben, das mit Plugins arbeiten soll. Das soll so funktionieren, dass es eine Dll „PluginManager“ von diesem Programm geladen wird, die dann andere DLLs, also die Plugins läd. Dazu übergibt die Exe einen Dll-Namen an die PluginManager.dll und die läd dann die entsprechende Funktion aus dem Plugin.
Hier der Code, der vom Compiler einwandfrei verbastelt wird, allerdings bekomme ich im Programm bei der ersten Funktion immer den Wert -1, der einem Fehlschlagen des Ladevorgangs der DLL entspricht.
#include
#include
#define DLL extern "C" \_\_declspec(dllexport)
// nur unter MS VC das Symbol DLL definieren; z.B. unter Linux wird DLL ignoriert
// Die Funktion, die anderen Programmen zur Verfügung gestellt werden soll
// (in diesem Beispiel: Addieren zweier Zahlen)
typedef wchar\_t\*(\_stdcall \*consolePointerSendPluginName)(void);
consolePointerSendPluginName SendPluginName;
typedef wchar\_t\*(\_stdcall \*consolePointerSendPluginAuthor)(void);
consolePointerSendPluginAuthor SendPluginAuthor;
typedef wchar\_t\*(\_stdcall \*consolePointerSendPluginEmail)(void);
consolePointerSendPluginEmail SendPluginEmail;
typedef wchar\_t\*(\_stdcall \*consolePointerSendPluginHomepage)(void);
consolePointerSendPluginHomepage SendPluginHomepage;
typedef wchar\_t\*(\_stdcall \*consolePointerSendPluginDescription)(void);
consolePointerSendPluginDescription SendPluginDescription;
typedef wchar\_t\*(\_stdcall \*consolePointerSendPluginBuildDate)(void);
consolePointerSendPluginBuildDate SendPluginBuildDate;
typedef wchar\_t\*(\_stdcall \*consolePointerSendPluginVersion)(void);
consolePointerSendPluginVersion SendPluginVersion;
typedef int (\_stdcall \*consolePointerInformThePlugin)(wchar\_t\* dReleasedEvent, wchar\_t\* dTitle, wchar\_t\* dArtist, wchar\_t\* dAlbum, int dLength, wchar\_t\* dUrl);
consolePointerInformThePlugin InformThePlugin;
DLL int InformPlugin(wchar\_t\* ReleasedEvent, wchar\_t\* Title, wchar\_t\* Artist, wchar\_t\* Album, int Length, wchar\_t\* Url, wchar\_t\* DllName)
{
HMODULE hDLL;
hDLL = LoadLibrary(DllName);
//MessageBox(0, DllName, L"Test", MB\_OK);
if(hDLL!=NULL)
{
InformThePlugin = (consolePointerInformThePlugin)GetProcAddress(hDLL,"InformThePlugin");
if(!InformThePlugin)
{
//MessageBoxA(0, "Error loading Plugin-Function", "Error", MB\_OK);
FreeLibrary(hDLL);
return -1;
}
else
{
return InformThePlugin(ReleasedEvent, Title, Artist, Album, Length, Url);
}
}
else
{
//MessageBoxA(0, "Error loading Plugin-File", "Error", MB\_OK);
return -2;
}
}
wchar\_t\* getPluginName(wchar\_t\* DllName){
HMODULE hDLL;
hDLL = LoadLibraryW(DllName);
if(hDLL!=NULL)
{
SendPluginName = (consolePointerSendPluginName)GetProcAddress(hDLL,"SendPluginName");
if(!SendPluginName)
{
//MessageBoxA(0, "Error loading Plugin-Function", "Error", MB\_OK);
FreeLibrary(hDLL);
return L"error\_loading\_plugin\_function";
}
else
{
return SendPluginName();
}
}
else
{
//MessageBoxA(0, "Error loading Plugin-File", "Error", MB\_OK);
return L"error\_loading\_plugin";
}
}
wchar\_t\* getPluginAuthor(wchar\_t\* DllName){
HMODULE hDLL;
hDLL = LoadLibraryW(DllName);
if(hDLL!=NULL)
{
SendPluginAuthor = (consolePointerSendPluginAuthor)GetProcAddress(hDLL,"SendPluginAuthor");
if(!SendPluginAuthor)
{
//MessageBoxA(0, "Error loading Plugin-Function", "Error", MB\_OK);
FreeLibrary(hDLL);
return L"error\_loading\_plugin\_function";
}
else
{
return SendPluginAuthor();
}
}
else
{
//MessageBoxA(0, "Error loading Plugin-File", "Error", MB\_OK);
return L"error\_loading\_plugin";
}
}
wchar\_t\* getPluginHomepage(wchar\_t\* DllName){
HMODULE hDLL;
hDLL = LoadLibraryW(DllName);
if(hDLL!=NULL)
{
SendPluginHomepage = (consolePointerSendPluginHomepage)GetProcAddress(hDLL,"SendPluginHomepage");
if(!SendPluginHomepage)
{
//MessageBoxA(0, "Error loading Plugin-Function", "Error", MB\_OK);
FreeLibrary(hDLL);
return L"error\_loading\_plugin\_function";
}
else
{
return SendPluginHomepage();
}
}
else
{
//MessageBoxA(0, "Error loading Plugin-File", "Error", MB\_OK);
return L"error\_loading\_plugin";
}
}
wchar\_t\* getPluginEmail(wchar\_t\* DllName){
HMODULE hDLL;
hDLL = LoadLibraryW(DllName);
if(hDLL!=NULL)
{
SendPluginEmail = (consolePointerSendPluginEmail)GetProcAddress(hDLL,"SendPluginEmail");
if(!SendPluginEmail)
{
//MessageBoxA(0, "Error loading Plugin-Function", "Error", MB\_OK);
FreeLibrary(hDLL);
return L"error\_loading\_plugin\_function";
}
else
{
return SendPluginEmail();
}
}
else
{
//MessageBoxA(0, "Error loading Plugin-File", "Error", MB\_OK);
return L"error\_loading\_plugin";
}
}
wchar\_t\* getPluginDescription(wchar\_t\* DllName){
HMODULE hDLL;
hDLL = LoadLibraryW(DllName);
if(hDLL!=NULL)
{
SendPluginDescription = (consolePointerSendPluginDescription)GetProcAddress(hDLL,"SendPluginDescription");
if(!SendPluginDescription)
{
//MessageBoxA(0, "Error loading Plugin-Function", "Error", MB\_OK);
FreeLibrary(hDLL);
return L"error\_loading\_plugin\_function";
}
else
{
return SendPluginDescription();
}
}
else
{
//MessageBoxA(0, "Error loading Plugin-File", "Error", MB\_OK);
return L"error\_loading\_plugin";
}
}
wchar\_t\* getPluginVersion(wchar\_t\* DllName){
HMODULE hDLL;
hDLL = LoadLibraryW(DllName);
if(hDLL!=NULL)
{
SendPluginVersion = (consolePointerSendPluginVersion)GetProcAddress(hDLL,"SendPluginVersion");
if(!SendPluginVersion)
{
//MessageBoxA(0, "Error loading Plugin-Function", "Error", MB\_OK);
FreeLibrary(hDLL);
return L"error\_loading\_plugin\_function";
}
else
{
return SendPluginVersion();
}
}
else
{
//MessageBoxA(0, "Error loading Plugin-File", "Error", MB\_OK);
return L"error\_loading\_plugin";
}
}
wchar\_t\* getPluginBuildDate(wchar\_t\* DllName){
HMODULE hDLL;
hDLL = LoadLibraryW(DllName);
if(hDLL!=NULL)
{
SendPluginBuildDate = (consolePointerSendPluginBuildDate)GetProcAddress(hDLL,"SendPluginBuildDate");
if(!SendPluginBuildDate)
{
//MessageBoxA(0, "Error loading Plugin-Function", "Error", MB\_OK);
FreeLibrary(hDLL);
return L"error\_loading\_plugin\_function";
}
else
{
return SendPluginBuildDate();
}
}
else
{
//MessageBoxA(0, "Error loading Plugin-File", "Error", MB\_OK);
return L"error\_loading\_plugin";
}
}
Versucht habe ich es schon mit dem Pluginpfad vom Anwendungsverzeichnis und vom DLL-Verzeichnis aus. Ausserdem habe ich es schon mit dem vollen Pfad „C:\blahblah…\c\d\e\f\g“ versucht…
Vielen Dank schon mal im voraus,
WorldRacer