简体   繁体   English

如何在 Qt C++ 中动态创建和加载 lib

[英]How do I create and load lib dynamically in Qt C++

As described on https://wiki.qt.io/How_to_create_a_library_with_Qt_and_use_it_in_an_application I would like to create dll (Windows 10) and load it dynamically be using QLibrary as plugin.https://wiki.qt.io/How_to_create_a_library_with_Qt_and_use_it_in_an_application所述,我想创建dll(Windows 10)并使用QLibrary作为插件动态加载它。

In Dependency Walker I see that exports and dll could be loaded.在 Dependency Walker 中,我看到可以加载导出和 dll。 But resolve gives me always 0. I tried several examples and hinds in web, but no success.但决心总是给我 0。我在网络上尝试了几个例子和 hinds,但没有成功。 What do I wrong?我怎么了?

.pro .pro

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

TEMPLATE = lib
HEADERS += eurolite_dmx512_pro_mk2.h \
    Eurolite_DMX512_Pro_MK2_global.h
SOURCES += eurolite_dmx512_pro_mk2.cpp
DEFINES += EUROLITE_DMX512_PRO_MK2_LIBRARY

global.h全局文件

#ifndef EUROLITE_DMX512_PRO_MK2_GLOBAL_H
#define EUROLITE_DMX512_PRO_MK2_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(EUROLITE_DMX512_PRO_MK2_LIBRARY)
#  define EUROLITE_DMX512_PRO_MK2 Q_DECL_EXPORT
#else
#  define EUROLITE_DMX512_PRO_MK2 Q_DECL_IMPORT
#endif
#endif // EUROLITE_DMX512_PRO_MK2_GLOBAL_H

.h 。H

#ifndef SHARED_H
#define SHARED_H

#include "Eurolite_DMX512_Pro_MK2_global.h"
#include <QDebug>

class Device
{
public:
    Device();
    void Testdll() {qDebug("OK");}
};

extern "C" EUROLITE_DMX512_PRO_MK2 int getVersion();
extern "C" EUROLITE_DMX512_PRO_MK2 QWidget *createWidget1();

int EUROLITE_DMX512_PRO_MK2 libStart(void)
{
    Device device;
    return 0;
}

#endif // SHARED_H

.cpp .cpp

#include <QWidget>
#include "eurolite_dmx512_pro_mk2.h"

Device::Device() {}

int getVersion()
{
    return 3;
}

QWidget *createWidget1()
{
    QWidget *widget = new QWidget();
    widget->resize(100, 100);
    return widget;
}

plugintest.c++插件测试.c++

#include "dmxservice.h"

#include <QApplication>
#include <QDebug>
#include <QLibrary>
#include <QMessageBox>
#include <QFile>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    bool dmxLibAktiv = false;
    QLibrary dmxlib;

    QMessageBox msgBox;

    QFile file(QCoreApplication::applicationDirPath()+"/devices/Eurolite_DMX512_Pro_MK2.dll");
    if(file.exists()==true)
    {
        QLibrary dmxlib(QCoreApplication::applicationDirPath()+"/devices/Eurolite_DMX512_Pro_MK2.dll");
        if(dmxlib.load()==true)
        {
            dmxLibAktiv = dmxlib.isLoaded();
            msgBox.setText("DLL loaded!\n");
            msgBox.exec();
        }
        else
        {
            msgBox.setText("DLL not loaded!\n"+dmxlib.errorString());
            msgBox.exec();
        }
    }
    else
    {
        msgBox.setText("DLL not found '"+QCoreApplication::applicationDirPath()+"'!\n");
        msgBox.exec();
    }

    if (dmxLibAktiv) {
        typedef QWidget *(*CreateWidgetFunction)();
        CreateWidgetFunction cwf = CreateWidgetFunction(dmxlib.resolve("createWidget1"));
        if (cwf) {
            QWidget *widget = cwf();
            if (widget)
                widget->show();
        } else {
            qDebug() << "Could not show widget from the loaded library";
        }
    }
    DmxService w;
    w.show();
    return a.exec();
}

You created a local QLibrary dmxlib(...);您创建了一个本地QLibrary dmxlib(...); inside the if (file.exists()) branch.if (file.exists())分支内。 So the outer dmxlib instance is never initialized.所以外部dmxlib实例永远不会被初始化。

ADDED : Do not re-declare the variable inside the if block, use setFileName() instead:添加:不要在if块内重新声明变量,而是使用setFileName()

QLibrary dmxlib;
...
if (file.exists()) {
  dmxlib.setFileName(QCoreApplication::applicationDirPath()+"/devices/Eurolite_DMX512_Pro_MK2.dll");
  if (dmxlib.load())
    ....
}

// ... use dmxlib

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在Qt C ++中为数组动态分配内存? - How do I dynamically allocate memory for arrays in Qt C++? 如何在 C++ 中创建一个简单的 Qt 控制台应用程序? - How do I create a simple Qt console application in C++? 如何在 C++ 中为堆栈动态创建结构? - How do I dynamically create a struct for a stack in C++? 如何在Visual C ++中创建.lib文件和.exe文件? - How do I create both a .lib file and an .exe file in Visual C++? C ++ - 使用live555 lib的Qt GUI的RTSP客户端我还需要什么? - C++ - RTSP Client with Qt GUI using live555 lib what else do i need? GTK应用程序:如何使用Qt / C ++创建工作指标? - GTK app: How do I create a working indicator with Qt/C++? 如何使用 Qt/c++ 为所有 UNIX 操作系统创建托盘图标? - How do I create a trayicon with Qt/c++ for all UNIX OS? 如何在C ++或Qt中创建进程? - How can I create a process in C++ or Qt? 在Qt C++单元测试中动态加载QQuickWindow而不是QQuickWidget - Dynamically load QQuickWindow instead of QQuickWidget in Qt C++ unit test 如何在C ++中使用列表的基础数据结构动态创建队列? - How do I dynamically create a queue with an underlying data structure of list in c++?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM