`
qimo601
  • 浏览: 3449180 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Qt DLL总结【三】-VS2008+Qt 使用QPluginLoader访问DLL

    博客分类:
  • Qt
阅读更多

 

目录

Qt DLL总结【一】-链接库预备知识

Qt DLL总结【二】-创建及调用QT的 DLL  

Qt DLL总结【三】-VS2008+Qt 使用QPluginLoader访问DLL

开发环境:VS2008、Qt4.7.4,附件有源码可供下载

         最近在总结如何访问DLL中的类对象及其成员函数,其中一种方法利用Qt的QPluginLoader类就可以方便快捷的访问DLL中的类,以及其中的类成员函数。

 

文件结构如下图

解决方案名:TestPlugin

1、Qt的Library项目(PluginDll):PlugInterface.h、PluginInstance.h、PluginInstance.cpp

2、Qt的Console Application项目(PluginConsole):main.cpp、PlugInterface.h(从上面的项目拷贝过来的)

 

 

 

程序建立步骤

 

 

步骤一、在VS里新建立一个DLL项目,名称PluginDll。

  1.      把自动生成的三个代码文件(PluginDll.h、PluginDll_global.h、PluginDll.cpp)直接删掉,这三个是Qt自己的建立Qt Dll的推荐方法,我们暂时用不到。
  2.      自己新建如下三个文件PlugInterface.h、PluginInstance.h、PluginInstance.cpp    
    备注:如果步骤一建立成一个exe应用项目,也可以通过改两个项目配置参数实现,生成DLL。
    一是修改Configuration Properties/General/Configuration type的值,将Application (.exe)改成Dynamic Library (.dll) ,
    二是修改Configuration Properties/Linker/General/Output File 的值,将$(OutDir)\$(ProjectName).exe改成$(OutDir)\$(ProjectName).dll
// PlugInterface.h
//接口类
#ifndef PLUGINTERFACE_H
#define PLUGINTERFACE_H

#include <QtPlugin>
class PlugInterface
{
public:
	virtual ~PlugInterface(){}
	//接口中的成员函数必须是纯虚函数
	virtual void testPlugin() = 0;
	virtual void helloWorld() = 0;
};
QT_BEGIN_NAMESPACE
//这个宏用声明接口
//Q_DECLARE_INTERFACE(接口类名,接口标识符)
Q_DECLARE_INTERFACE(PlugInterface, "PlugInterfaceDll/1.0");
QT_END_NAMESPACE
#endif // PLUGINTERFACE_H
 
//接口标识符必须唯一,所以一般加个版本号1.
//This macro is normally used right after the class definition for ClassName, in a header file.
//If you want to use Q_DECLARE_INTERFACE with interface classes declared in a namespace,
//then you have to make sure the Q_DECLARE_INTERFACE is not inside a namespace though. 

  
// PluginInstance.h
//业务类的头文件
#ifndef PLUGININSTANCE_H
#define PLUGININSTANCE_H

#include "PlugInterface.h"
#include <QObject>
//PluginInstance必须继承QObject类,才能使用如下Qt的方法
//PluginInstance还得继承接口PlugInterface
class PluginInstance : public QObject, PlugInterface
{
	Q_OBJECT
		//Q_INTERFACES宏定义告诉Qt MOC,PluginInstance类继承了插件PlugInterface
		//将该接口注册到Qt的meta-object system
		Q_INTERFACES(PlugInterface)
public:
	PluginInstance();
	~PluginInstance();
	//业务成员1
	void testPlugin();
	//业务成员2
	void helloWorld();
};

#endif // PLUGININSTANCE_H

 

// PluginInstance.cpp
//业务类成员函数定义
#include "PluginInstance.h"
#include <QtCore>
PluginInstance::PluginInstance()
{
}
PluginInstance::~PluginInstance()
{
}
void PluginInstance::testPlugin()
{
	qDebug() << "test";
}
void PluginInstance::helloWorld()
{
	qDebug() << "helloWorld";
}
//这个宏用来导出动态链接库
//Q_EXPORT_PLUGIN2(插件名, 类名)
//Q_EXPORT_PLUGIN2("PluginDll", PluginInstance)
Q_EXPORT_PLUGIN2("PluginInstance", PluginInstance)
//插件名最好和TARGET有关,而我们PluginDll项目转换成Qt项目的.pro文件,target = PluginDll
//所以说这里名字不影响编程,只是为了方便理解,让插件名和项目名一致最好。
//对于一个Qt插件来说,最好只有一个Q_EXPORT_PLUGIN2宏定义,并且最好在实现的文件里出现,而非头文件中。

 

步骤二、在VS里新建立一个ApplicationL项目,名称PluginConsole。

  1.     将前面PluginDll项目中的接口头文件PlugInterface.h拷贝到PluginConsole项目中;
  2.     因为plugin.dll已经在解决方案的Debug文件中了,暂时就不需要拷贝到PluginConsole项目中来了。如果没有需要拷贝过来才能引用
    在main.cpp中通过QPluginLoader调用PluginDll.dll
#include <QtCore/QCoreApplication>
#include "PlugInterface.h"
#include <QPluginLoader>
#include <QDebug>
int main(int argc, char *argv[])
{
	QCoreApplication a(argc, argv);
	PlugInterface *plugObject; 
	//不知道为啥,路径我写成下面就出错呢?编译可以通过,运行时会提示异常
	//QPluginLoader  pluginLoader("PluginDll.dll"); 
	//加载插件
	QPluginLoader  pluginLoader("../Debug/PluginDll.dll"); 
	//
	QObject *plugin = pluginLoader.instance();   
	if (plugin)
	{
		qDebug() << "instance success";
		//使用qobject_cast将QObject类型转换成我们想要的PlugInterface类对象
		plugObject= qobject_cast<PlugInterface *>(plugin);    
		plugObject->helloWorld();    
		plugObject->testPlugin();
	}
	else
		qDebug() << "instance fail";
	return a.exec();
}
 

综合了网上很多的例子,很难直接运行,最后自己总结出来的例子在附件上,可以直接运行。
那些参考链接,就不一一引用了,在此谢谢各位的帮助!

1
0
分享到:
评论

相关推荐

    qt无法定位程序输入点 libstdc++-6

    总结而言,"qt无法定位程序输入点 libstdc++-6"的问题主要是由于缺少或版本不匹配的`libstdc++-6.dll`动态链接库导致的。通过检查系统路径、重新安装Qt、更新系统和驱动,或者使用工具检查依赖关系,通常可以有效地...

    vlc-qt-1.2.0库【VS2019+Qt 5.15】

    关于**VS2019+Qt 5.15**的兼容性,VLC-Qt 1.2.0经过了与这两个工具的适配,意味着你可以使用Visual Studio 2019作为IDE,同时享受Qt 5.15的最新特性和改进。VS2019提供了强大的C++开发环境,而Qt 5.15是Qt框架的一个...

    QT调用mfc dll和qt dll

    - QT支持更方便的插件系统(QPluginLoader),允许在运行时加载和使用QT DLL。 - 在DLL中定义一个类继承自`QObject`,并使用`Q_OBJECT`宏,以便QT的元对象系统可以工作。 - 在主应用程序中,使用`QPluginLoader`...

    QT调用dll和MFC调用QT的dll

    在软件开发中,有时我们需要在QT环境中调用动态链接库(DLL),或者将QT编译成DLL供MFC应用使用。这篇内容将深入探讨如何实现这些操作。 1. QT调用DLL: - 创建DLL:首先,你需要在QT环境中创建一个DLL项目,定义...

    Qt-Advanced-Docking-System-master

    总结,Qt高级停靠系统是提升用户界面交互性和用户体验的重要工具,"Qt-Advanced-Docking-System-master"项目提供了更强大、灵活的停靠功能,为开发者提供了更多的定制空间。通过深入学习和实践,开发者可以构建出...

    qt-unified-windows-x64-4.6.1-online.exe

    在使用"qt-unified-windows-x64-4.6.1-online.exe"进行安装时,用户可以选择安装所需的Qt库、开发工具和附加模块。Qt库包括了各种平台API,如GUI、网络、数据库等,它们是编写Qt应用程序的基础。开发工具主要包括Qt ...

    qwt 安装配置说明(VS2010 + Qt-5.5.1 + qwt-6.1.3)

    ### QWT 安装配置说明 (VS2010 + Qt-5.5.1 + qwt-6.1.3) #### 1. 解决的问题 本指南旨在解决如何在Visual Studio 2010环境下成功安装和配置qwt-6.1.3与Qt-5.5.1的兼容性问题,并确保可以顺利运行qwt中的示例程序。...

    qt-opensource-windows-x86-5.14.2

    2. **Qt库**: 包含所有必要的静态和动态库文件,如.lib和.dll,这些库文件是开发人员在构建应用时链接到的。 3. **头文件**: .h文件,提供了Qt API的声明,供开发者在源代码中引用。 4. **Qt Creator IDE**: 一个...

    今天在windows7下安装qt-opensource-windows-x86-5.12.9报错: gdb.exe -系统错误

    今天在windows7下安装qt-opensource-windows-x86-5.12.9报错: gdb.exe -系统错误 无法启动此程序,因为计算机中丢失api-ms-win-core-path-l1-1-0.dll。尝试重新安装该程序以解决此问题

    Qt5(VS2015+Qt5.10.0)下实现一个Dll文件中包含多个自定义控件

    本篇将详细讲解如何在VS2015与Qt5.10.0环境下,通过参考Qwt6.1.3的源码,实现在一个DLL文件中包含多个自定义控件,并在Qt Designer中集成和使用。 首先,我们需要理解Qt的插件系统。Qt的控件插件允许我们在运行时...

    vs2008 mt方式静态编译qt4.8.6库

    windows平台下,vs2008使用mt的编译方式,编译的qt4.8.6版本的静态库。 压缩包中包含了编译后的二进制库文件,以及使用qt库时的头文件等。 使用qt开发的程序不想带上qt的dll时,可以使用压缩包中的库进行开发,因为...

    qtmysql.dll-Qt6.4.2-MinGW64驱动包

    1. 将libcrypto-1_1-x64.dll,libmysql.dll,libssl-1_1-x64.dll这3个文件复制到D:\Qt\6.4.2\mingw_64\bin文件夹中 2. qsqlmysql.debug, qsqlmysql.dll放入\Qt\6.4.2\mingw_64\plugins\sqldrivers中

    VS2017+QT DLL UI.zip

    在本项目中,"VS2017+QT DLL UI.zip" 包含了使用Visual Studio 2017(VS2017)集成开发环境,通过MFC(Microsoft Foundation Classes)调用QT库创建带用户界面的动态链接库(DLL)的相关资源。这个项目结合了两个...

    vtk8.2含有QVTKWidgetPlugin.dll qt5.12.12+pcl1.12.1+vtk8.2

    在"vtk8.2含有QVTKWidgetPlugin.dll qt5.12.12+pcl1.12.1+vtk8.2"这个标题中,我们可以看到几个关键的组件: 1. **VTK 8.2**: 这是Visualization Toolkit的一个特定版本,8.2代表了它的主要版本号。VTK包含了大量的...

    将QT界面做成dll在qt其他程序中调用

    这个过程涉及到QT的库使用、DLL的创建以及如何在不同的QT应用程序中调用DLL中的功能。下面我们将详细探讨这些知识点。 1. **QT库的管理**: - QT库分为静态库和动态库两种形式。静态库将所有依赖项打包到可执行...

    Qt使用 poppler-qt5实现PDF阅读器

    在本文中,我们将深入探讨如何使用Qt结合poppler-qt5库来开发一个功能完备的PDF阅读器。Qt是一个跨平台的应用程序开发框架,而poppler-qt5是基于poppler库的一个Qt接口,用于处理PDF文档。我们将讨论以下几个关键...

    vs2015+qt5.7.1单独编译QWebengine 包含Debug、Release的dll和lib,以及编译方法;

    1. **配置环境**:确保在Qt的安装目录下,你已经配置了对应的MSVC编译器,例如添加`msvc2015_64`到PATH环境变量,这将指示Qt使用VS2015的64位编译器。 2. **获取源代码**:从Qt官方Git仓库下载QWebEngine的源代码,...

    QT-qsqlmysql-VS2022-MINGW7.3

    在本压缩包中,提供了适用于这两种编译环境的QSQLMySQL驱动,这意味着无论你是VS2022用户还是MinGW 7.3用户,都可以直接使用这些预编译的库文件,无需自行编译QT源码。对于VS2022用户,可以按照QT官方文档的指导配置...

    在Qt中调用vs2008生成的dll以及lib的方法

    总结来说,调用由Visual Studio 2008生成的DLL和LIB在Qt中涉及到正确的库文件生成、链接以及跨平台配置等知识点。在实现过程中,需要根据目标平台选择合适的调用方式,并注意文件路径的设置,以保证程序能够正确运行...

Global site tag (gtag.js) - Google Analytics