ich bin dabei eine Anwendung zu schreiben, die mittels Plugins erweitert werden kann. Also kann man sagen, dass ich an einer Plugin-Architektur programmiere.
Die Plugins werden beim Starten der Anwendung dynamisch, mit der QLibrary, geladen. Somit habe ich Zugriff auf die externen Methoden der Plugins.
Damit ihr euch das besser vorstellen könnt etwas Code
Code: Alles auswählen
#ifndef IPLUGIN_H
#define IPLUGIN_H
class PluginInterface
{
public:
virtual void process() = 0;
virtual const char* getName() = 0;
};
#endif // IPLUGIN_H
Code: Alles auswählen
#include "plugin1.h"
#include <iostream>
Plugin1::Plugin1()
{
}
void Plugin1::process()
{
std::cout << "Remote call to "<< getName() << " successful!!!" << std::endl;
}
const char* Plugin1::getName()
{
return "Plugin1";
}
extern "C" PLUGIN1SHARED_EXPORT Plugin1* CreatePlugin()
{
return new Plugin1();
}
Code: Alles auswählen
typedef PluginInterface* (*PLUGIN_FACTORY);
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QLibrary lib("./Plugin1");
PLUGIN_FACTORY p = (PLUGIN_FACTORY) lib.resolve("CreatePlugin");
if(p)
{
//yes, this DLL exposes the 2 functions we >need, it is a plugin we can use!
//now invoke the factory to create the plugin object
PluginInterface* p_plugin = (*p);
std::cout << "Now working with plugin: " << p_plugin->getName() << std::endl;
p_plugin->process();
}else
{
std::cout << "Plugin NOT WORKING!!!!" << std::endl;
}
return a.exec();
}
Die Plugins werden, wie schon gesagt, ohne weitere Probleme geladen, jedoch klappt der Aufruf, im dritten Codeblock, p_plugin->getName() nicht! Ich bekomme da eine read access violation, wie im Bild zu sehen ist.
Da ich beim Aufruf des Plugins ein "Plugin1" Objekt zurück bekomme, und ich dies auch möchte, verstehe ich diese Fehlermeldung nun nicht wirklich!
Habt ihr da vielleicht eine Lösung für mein Problem? Vielleicht sehe ich das Problem vor lauter "Code" nun nicht und es ist doch soooo einfach.
Oder vielleicht habt ihr auch eine andere und bessere/effiziente Lösung, die ich nicht bedacht habe...ich bin für jeden Vorschlag offen!
Vielen Dank schon im voraus!
Mario
PS: Wenn gewünscht kann ich das Projekt auch gerne hochladen, das wäre kein Problem!