QLibrary - Aufruf von externen Methoden in dlls

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
mariob1
Beiträge: 6
Registriert: 27. Juni 2012 20:01

QLibrary - Aufruf von externen Methoden in dlls

Beitrag 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!
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QLibrary - Aufruf von externen Methoden in dlls

Beitrag 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.
mariob1
Beiträge: 6
Registriert: 27. Juni 2012 20:01

Re: QLibrary - Aufruf von externen Methoden in dlls

Beitrag 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?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QLibrary - Aufruf von externen Methoden in dlls

Beitrag von franzf »

Merde, meine Augen...
Dein typedef ist falsch:

Code: Alles auswählen

typedef PluginInterface* (*PLUGIN_FACTORY)()
mariob1
Beiträge: 6
Registriert: 27. Juni 2012 20:01

Re: QLibrary - Aufruf von externen Methoden in dlls

Beitrag von mariob1 »

Hallo franzf,

danke dir, funktioniert :)
Antworten