Plugin w QT

0

Witam. Chcę sobie zrobić pluginy w aplikacji. Chcę aby każdy plugin dodawał do menu głównego jakąś pozycję, która robi różne rzeczy, np. wyświetla sobie QWidgeta( w którym to implementuje różną funkcjonalność) jako okno MDI . Ogólnie chciałem zrobić "zwykłą" QTową dll w której umieszczam sobie klasę customQWidget, a w głównym programie rzucam ją na QWidget i wywołuję metodę show() ... Tak jakoś to widzę. Ale oczywiście teoria ma się nijak do praktyki. Zrobiłem sobie DLL :

 
#include "DLLTest_global.h"
#include <QMessageBox>
#include <QDebug>

extern "C" DLLTESTSHARED_EXPORT void foo();
------------------------------------------------------------------------------
#include "dlltest.h"
extern "C" DLLTESTSHARED_EXPORT void foo()
{
  QMessageBox::information(0, "asdfasf", "asfasfd");
}

A to jest kod z pushButtona:

void MainWindow::onPushBtnClicked()
{
  typedef void (*f)();
  f funkcja;
  QLibrary lib("DLLTest.dll");
  funkcja = (f)lib.resolve("foo");
  if(funkcja) funkcja(); <<<<<< uporczywa linijka .... 
}

Teraz - gdy w funkcji foo() wpiszę sobie qDebug() << "blabla " ; to wszystko działa, natomiast gdy chcę aby wyświetlił mi się MessageBox, to mam naruszenie ochrony pamięci.

Proszę tylko o jakieś naprowadzenie co robię (myślę) źle. Chcę tylko wywołać klasę customQWidget z DLL i dodać te menu, żeby móc rozszerzyć funkcjonalność.

0

Tak się akurat składa,że w tej chwili właśnie piszę swoją .dll pod Qt ;] Zrobiłem tak:
1.W tym pliku coś_global.h zawierającym makro exportu importu zdeklarowałem sobie funkcję którą chcę wywoływać z dllki:

MY_EXPORT void myFunction(void);

jej ciało jest zdefiniowane w cppku.
2.Po kompilacji projektu mającego stworzyć .dll przeniosłem otrzymany plik .lib i .dll do projektu testowego,i tam:
a)do additional dependencies linkera dodałem tego mylib.lib
b)wrzuciłem .dll do tego folderu gdzie powstanie .exe aplikacji
__UWAGA!__pamiętaj,że .dll i .lib skompilowany jako release tylko z takim buildem będzie współdziałał!To samo tyczy się debuga
3.Do projektu testowego dodałem coś_global.h.Od teraz tam gdzie go zainkluduję tam mogę używać myFunction() normalnie,bez żadnych externów i QLibrary

0

No dobra. Ale ja chcę zrobić aplikację, która:

  1. skanuje folder z dllkami
  2. na podstawie jakiejś interfejsowej funkcji w DLLce odczytuje nazwę pozycji menu, którą dodam do głównego menu aplikacji
  3. po kliknięciu na nową pozycję w menu mojej aplikacji zostanie wyświetlone okno (wyeksportowany customQWidget), którego kod znajduje się w załadowanej DLLce ...

Chcę aplikację którą napiszę raz, a potem tylko dokładać dllki w których będę miał nazwy menu i klasy QWidget, które będę wyświetlał jako MDI ...

0

To innaczej jeszcze.Poczytaj w Assistancie o Plugin System z Core Features,zwłaszcza ustęp "The Lower-Level API: Extending Qt Applications".
W skrócie musisz stworzyć klasę interfejsu,użyć QPluginLoadera i stamtąd wyciągać nowe obiekty

1 użytkowników online, w tym zalogowanych: 0, gości: 1