zoukankan      html  css  js  c++  java
  • Qt DLL总结【三】-VS2008+Qt 使用QPluginLoader访问DLL

    目录

    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
    Cpp代码  收藏代码
    1. // PlugInterface.h  
    2. //接口类  
    3. #ifndef PLUGINTERFACE_H  
    4. #define PLUGINTERFACE_H  
    5.   
    6. #include <QtPlugin>  
    7. class PlugInterface  
    8. {  
    9. public:  
    10.     virtual ~PlugInterface(){}  
    11.     //接口中的成员函数必须是纯虚函数  
    12.     virtual void testPlugin() = 0;  
    13.     virtual void helloWorld() = 0;  
    14. };  
    15. QT_BEGIN_NAMESPACE  
    16. //这个宏用声明接口  
    17. //Q_DECLARE_INTERFACE(接口类名,接口标识符)  
    18. Q_DECLARE_INTERFACE(PlugInterface, "PlugInterfaceDll/1.0");  
    19. QT_END_NAMESPACE  
    20. #endif // PLUGINTERFACE_H  
    21.    
    22. //接口标识符必须唯一,所以一般加个版本号1.  
    23. //This macro is normally used right after the class definition for ClassName, in a header file.  
    24. //If you want to use Q_DECLARE_INTERFACE with interface classes declared in a namespace,  
    25. //then you have to make sure the Q_DECLARE_INTERFACE is not inside a namespace though.   

      

    Cpp代码  收藏代码
    1. // PluginInstance.h  
    2. //业务类的头文件  
    3. #ifndef PLUGININSTANCE_H  
    4. #define PLUGININSTANCE_H  
    5.   
    6. #include "PlugInterface.h"  
    7. #include <QObject>  
    8. //PluginInstance必须继承QObject类,才能使用如下Qt的方法  
    9. //PluginInstance还得继承接口PlugInterface  
    10. class PluginInstance : public QObject, PlugInterface  
    11. {  
    12.     Q_OBJECT  
    13.         //Q_INTERFACES宏定义告诉Qt MOC,PluginInstance类继承了插件PlugInterface  
    14.         //将该接口注册到Qt的meta-object system  
    15.         Q_INTERFACES(PlugInterface)  
    16. public:  
    17.     PluginInstance();  
    18.     ~PluginInstance();  
    19.     //业务成员1  
    20.     void testPlugin();  
    21.     //业务成员2  
    22.     void helloWorld();  
    23. };  
    24.   
    25. #endif // PLUGININSTANCE_H  
    Cpp代码  收藏代码
    1. // PluginInstance.cpp  
    2. //业务类成员函数定义  
    3. #include "PluginInstance.h"  
    4. #include <QtCore>  
    5. PluginInstance::PluginInstance()  
    6. {  
    7. }  
    8. PluginInstance::~PluginInstance()  
    9. {  
    10. }  
    11. void PluginInstance::testPlugin()  
    12. {  
    13.     qDebug() << "test";  
    14. }  
    15. void PluginInstance::helloWorld()  
    16. {  
    17.     qDebug() << "helloWorld";  
    18. }  
    19. //这个宏用来导出动态链接库  
    20. //Q_EXPORT_PLUGIN2(插件名, 类名)  
    21. //Q_EXPORT_PLUGIN2("PluginDll", PluginInstance)  
    22. Q_EXPORT_PLUGIN2("PluginInstance", PluginInstance)  
    23. //插件名最好和TARGET有关,而我们PluginDll项目转换成Qt项目的.pro文件,target = PluginDll  
    24. //所以说这里名字不影响编程,只是为了方便理解,让插件名和项目名一致最好。  
    25. //对于一个Qt插件来说,最好只有一个Q_EXPORT_PLUGIN2宏定义,并且最好在实现的文件里出现,而非头文件中。  

     

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

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

     

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

    http://qimo601.iteye.com/blog/1402501

  • 相关阅读:
    250 浅拷贝Object.assign(target, ...sources),深拷贝
    249 递归:概念,利用递归求1~n的阶乘,利用递归求斐波那契数列,利用递归遍历数据
    248 闭包:概念,作用,案例,思考题案例,chrome 中调试闭包
    247 高阶函数 之 函数可以作为参数传递
    246 JavaScript严格模式
    245 改变函数内部 this 指向:call,apply,bind,call、apply、bind 三者的异同
    244 函数内部的this指向:6种
    243 函数:函数的3种定义方式,函数的6种调用方式
    242 Object.defineProperty
    241 获取对象的属性名:Object.keys(对象)
  • 原文地址:https://www.cnblogs.com/findumars/p/6350227.html
Copyright © 2011-2022 走看看