Plugin w QT

Odpowiedz Nowy wątek
2011-08-11 20:28
M
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ść.

Pozostało 580 znaków

2011-08-11 20:39
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


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 2x, ostatnio: MasterBLB, 2011-08-11 20:40

Pozostało 580 znaków

2011-08-11 21:10
M
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 ...

Pozostało 580 znaków

2011-08-11 21:18
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


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]

Pozostało 580 znaków

2011-08-12 09:34
0

http://doc.qt.nokia.com/latest/plugins-howto.html


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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