Qt 使用vs2008+Qt使用QPluginLoader访问DLL

访问dll的方法有很多,我列的这一种是个人认为比较容易理解和实现的,就是使用QPluginLoader来访问dll。

整理来自: http://qimo601.iteye.com/blog/1402501

文件结构如下图

解决方案名:TestPlugin

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

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

 

 

 

程序建立步骤

 

 

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

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

 

PluginInstance.cpp代码 
  1. // PluginInstance.cpp  
  2. //业务类成员函数定义  
  3. #include "PluginInstance.h"  
  4. #include   
  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
main.cpp代码
  1. #include   
  2. #include "PlugInterface.h"  
  3. #include   
  4. #include   
  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(plugin);      
  20.         plugObject->helloWorld();      
  21.         plugObject->testPlugin();  
  22.     }  
  23.     else  
  24.         qDebug() << "instance fail";  
  25.     return a.exec();  
  26. }

注意:.dll文件要放到跟源程序一块的路径下,不然不会显示"instance fail"。这点请注意,之前我的程序老是显示失败,找了好久才注意到原因在这里。

本人亲测,运行结果如图:

Qt 使用vs2008+Qt使用QPluginLoader访问DLL_第1张图片

希望我整理的文章能对你有所帮助,至少我是收获了很多,谢谢!

你可能感兴趣的:(Qt,qt,插件,vs2008,dll)