QT in einer DLL verwenden



  • Okay, ich habe von QT noch relativ wenig Ahnung bis auf die Basics, muss aber derzeit damit arbyten. Da ich in wxWidgets einiges an Problemen mit einem ähnlichen Design hatte frage ich hier. Hab über Google leider nix interessantes dazu gefunden mit dem Suchmuster "using qt in a dll". Zu wxWidgets würde man hier einiges finden, wenn man das austauscht.

    Welche Schritte sind nötig, bzw sind überhaupt irgendwelche Aufrufe nötig um QT in einer DLL zu verwenden, sprich eigene Objekte die von QWidget abgeleitet werden in eine .dll zu stecken und dann in einer Anwendung zu nutzen? Muss ich die .dll irgendwie an QT "anmelden" oder eine Klasse ableiten etc?



  • Eine DLL erstellt du indem du als Template "lib" verwendest.

    TEMPLATE = lib
    TARGET = MyLibrary
    CONFIG += dll

    DEFINES += QT_DLL
    win32:DEFINES += MYLIB_DLL MYLIB_MAKEDLL

    HEADERS += ...
    SOURCES += ...
    FORMS += ...

    Das ist alles in der qmake Dokumentation erklärt.
    Ansonsten anhand von Qt Bibliotheken z.B. qwt, wwwidgets lernen wie die das gemacht haben.



  • pospiech schrieb:

    Eine DLL erstellt du indem du als Template "lib" verwendest.

    TEMPLATE = lib
    TARGET = MyLibrary
    CONFIG += dll

    DEFINES += QT_DLL
    win32:DEFINES += MYLIB_DLL MYLIB_MAKEDLL

    HEADERS += ...
    SOURCES += ...
    FORMS += ...

    Das ist alles in der qmake Dokumentation erklärt.
    Ansonsten anhand von Qt Bibliotheken z.B. qwt, wwwidgets lernen wie die das gemacht haben.

    Wie ich es erstelle per qmake weiss ich, nur welche Aufrufe in Richtung QT eben getätigt werden müssen, dazu habe ich nix gefunden. Bei wxWidgets habe ich ziemlich lange suchen müssen dafür und einiges an Crashes gehabt bis es 100% gefunzt hat.
    rya.

    edit:
    Habs gefunden nach einer längeren Google Session:

    #include <qmfcapp.h>
     #include <qwinwidget.h>
    
     #include <QtGui/QMessageBox>
     #include <windows.h>
    
     BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpvReserved*/ )
     {
         static bool ownApplication = FALSE;
    
         if ( dwReason == DLL_PROCESS_ATTACH )
             ownApplication = QMfcApp::pluginInstance( hInstance );
         if ( dwReason == DLL_PROCESS_DETACH && ownApplication )
             delete qApp;
    
         return TRUE;
     }
    
    /*
    The DLL entry point function DllMain uses the QMfcApp::pluginInstance function
    to make sure that exactly one instance of QApplication exists in the process, 
    and that the DLL owning that instance stays loaded in memory.
    */
    
     extern "C" __declspec(dllexport) bool showDialog( HWND parent )
     {
         QWinWidget win( parent );
         win.showCentered();
         QMessageBox::about( &win, "About QtMfc", "QtMfc Version 1.0\nCopyright (C) 2003" );
    
         return TRUE;
     }
    

    http://doc.qt.nokia.com/solutions/4/qtwinmigrate/winmigrate-qt-dll-example.html



  • Scorcher24 schrieb:

    Wie ich es erstelle per qmake weiss ich, nur welche Aufrufe in Richtung QT eben getätigt werden müssen, dazu habe ich nix gefunden.

    Gar keine...

    Das Nutzen einer DLL ist in C++ immer dasselbe und höchstens Compiler spezifisch.
    Bei mingw wäre es das Nutzen der Header Dateien und das Laden der .a Dateien.

    Bei msvc eben .lib statt .a Dateien und es müssen Export/Import Definitionen erstellt werden.

    Das Beispiel was du gepostet hast zeigt das nur ansattsweise, hier mal ein vollständigeres:

    Header Datei zum Konfigurieren der EXPORT Definition

    #ifndef QCAMERASMX_GLOBAL_H
    #define QCAMERASMX_GLOBAL_H
    
    #include <QtGlobal>
    
    #if defined(_MSC_VER) /* MSVC Compiler */
    #pragma warning( disable : 4100 )
    #endif
    
    #if defined(Q_WS_WIN)
    
    #ifdef SMXCAMERA_DLL
    
    #if defined(SMXCAMERA_NODLL)     // Do not create a DLL library
        #define QSMXCAMERA_EXPORT
    #else
        #if defined(SMXCAMERA_MAKEDLL) // create a DLL library
            #define QSMXCAMERA_EXPORT  __declspec(dllexport)
        #else                           // use a DLL library
            #define QSMXCAMERA_EXPORT  __declspec(dllimport)
        #endif
    #endif
    
    #endif // SMXCAMERA_DLL
    
    #endif // Q_WS_WIN
    
    #ifndef QSMXCAMERA_EXPORT
    #define QSMXCAMERA_EXPORT
    #endif
    
    #endif // QCAMERASMX_GLOBAL_H
    

    wird in den header Dateien der DLL geladen und genutzt:

    #ifndef WIDGETCAMERASMXSETTINGS_H_
    #define WIDGETCAMERASMXSETTINGS_H_
    
    #include "QCameraSMXGlobal.h"
    
    #include <QWidget>
    
    class QCameraSMX;
    
    namespace Ui
    {
        class WidgetCameraSMXSettings;
    }
    
    class QSMXCAMERA_EXPORT WidgetCameraSMXSettings : public QWidget
    {
        Q_OBJECT
    ...
    

    In diesem Konstrukt muss zum Erstellen der Dll SMXCAMERA_DLL und SMXCAMERA_MAKEDLL definiert sein.
    Zum Laden der Dll nur SMXCAMERA_DLL. Wenn keine msvc Compiler genutzt wird braucht man gar nichts tun.



  • Meh, net böse gemeint, aber ich weiss wie man eine DLL erstellt und nen Compiler benutzt. Es ging mir eben nur darum, ob irgendwelche Objekte in der DLL erzeugt werden müssen für QT, ähnlich wie eben bei wxWidgets. Scheint aber ja nicht so.
    rya.



  • Scorcher24 schrieb:

    Meh, net böse gemeint, aber ich weiss wie man eine DLL erstellt und nen Compiler benutzt.

    Hatte mich auch schon gewundert.

    Scorcher24 schrieb:

    Es ging mir eben nur darum, ob irgendwelche Objekte in der DLL erzeugt werden müssen für QT, ähnlich wie eben bei wxWidgets. Scheint aber ja nicht so.
    rya.

    Kannst du das mal zeigen, ich kenne nämlich wxWidgets gar nicht.


Anmelden zum Antworten