Seite 1 von 1

QLibrary - Aufruf von externen Methoden in dlls

Verfasst: 28. Juni 2012 14:48
von mariob1
Hallo Qt-Gurus,

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();
}
Nun zu meinem Problem:
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!

Re: QLibrary - Aufruf von externen Methoden in dlls

Verfasst: 28. Juni 2012 15:46
von franzf

Code: Alles auswählen

PluginInterface* p_plugin = (*p);
Und was ist das? p ist ein stinknormaler Funktionszeiger. Aufrufen tust du das Ding wie ne normale Funktion:

Code: Alles auswählen

PluginInterface* p_plugin = p();
Ein besserer Name für den Zeiger, wie z.B. "factoryMethod" statt "p" und man liest den Code gleich leichter.

Re: QLibrary - Aufruf von externen Methoden in dlls

Verfasst: 28. Juni 2012 16:17
von mariob1
Hallo franzf,

danke für deine Antwort!

Ich habe den Code nach deinen Angaben umgestellt,jedoch bekomme ich schon beim builden folgende Fehlermeldung in der Codezeile

Code: Alles auswählen

PluginInterface* p_plugin = pluginFactoryMethod();
error: C2064: term does not evaluate to a function taking 0 arguments

was mir die Fehlermeldung sagt ist mir klar...aber warum verlangt er irgend welche Parameter??? und wenn er welche verlangt, dann welche denn???
eine Idee dazu?

Re: QLibrary - Aufruf von externen Methoden in dlls

Verfasst: 28. Juni 2012 17:26
von franzf
Merde, meine Augen...
Dein typedef ist falsch:

Code: Alles auswählen

typedef PluginInterface* (*PLUGIN_FACTORY)()

Re: QLibrary - Aufruf von externen Methoden in dlls

Verfasst: 29. Juni 2012 10:49
von mariob1
Hallo franzf,

danke dir, funktioniert :)