VS2017+QT5.9.1使用大漠插件(COM组件)

来源:互联网 发布:英雄联盟视频软件 编辑:程序博客网 时间:2024/06/05 03:20

工具下载:

VS2017的QT插件:qt-vsaddin-msvc2017-2.1.2-beta-03.08.2017.vsix

VS2017的QT5.9.1 msvc2017_32位版本(里面有32和64位的):http://pan.baidu.com/s/1cgy7hG


测试工程:http://download.csdn.net/download/qing666888/9949278



VS2017集成环境,使用Qt插件,编写基于Qt5.9.1库的windows应用程序,使用VS2017+QT5.9.1+msvc2017_32集成开发环境,但是32的QT版本QT5.9.1 安装包已经不再提供了,需要自己手动编译32位版本。官方只提供了msvc2017_64这个64位的版本,但是大漠插件只能支持32位的QT版本。

在Qt的安装目录下有dumpcpp.exe工具,可以将dll文件导出成Qt可以使用的.h和.C文件。执行下面的命令(dumpcpp.exe +空格+dll路径):dumpcpp.exe F:\CodeOsChina\VS2017\LOLkapai\x64\Debug\dm.dll


就会在目录下面生成DLL的导出.h .cpp文件。



就会在当前文件夹下生成dm.h和dm.cpp文件。 将上一步生成的dm.h和dm.cpp文件导入工程,就可以调用该COM组件的接口了,但是为了方便使用,我们可以将该COM组件生成的类再做一次封装。 创建一个CMyDM类(类名随意改)。该类要实现COM组件对象实例化,并且当实例化失败时,调用COM组件注册工具,注册COM组件。并提供清理COM组件资源的方法。代码如下: 

[cpp] view plain copy
  1. #pragma once  
  2. #include "dm.h"  
  3.   
  4. using namespace Dm;  
  5.   
  6. class CMyDM  
  7. {  
  8. public:  
  9.     CMyDM();  
  10.     ~CMyDM();  
  11.   
  12.     /// 获取类的实例  
  13.     static Idmsoft* GetIns();  
  14.   
  15.     /// 清理COM接口,main函数返回前,应确保调用此方法,否则可能引起内存泄漏  
  16.     static int deInit();  
  17.   
  18. private:  
  19.     /// 初始化COM组件  
  20.     static void init();  
  21.     static void RegDllByCmd(QString dllName);  
  22.   
  23. };  


[cpp] view plain copy
  1. #include "MyDM.h"  
  2. #include <QMessageBox>  
  3. #include <QDir>    
  4. #include <QProcess>    
  5. #include <QAxWidget>  //需在Pro文件中添加    
  6. #include <qdebug.h>  
  7. #include <QtWidgets/QApplication>  
  8.   
  9. #pragma execution_character_set("utf-8")  
  10.   
  11. Idmsoft* m_DM;  
  12. bool m_bNeedClear;  
  13.   
  14. CMyDM::CMyDM()  
  15. {  
  16.     m_DM = NULL;  
  17.     m_bNeedClear = false;  
  18. }  
  19.   
  20. CMyDM::~CMyDM()  
  21. {  
  22.     deInit();  
  23. }  
  24.   
  25. Idmsoft* CMyDM::GetIns()   
  26. {  
  27.     if (m_DM == NULL)   
  28.     {  
  29.         qDebug("new CFZCB");  
  30.         m_DM = new Idmsoft();  
  31.         init();  
  32.     }  
  33.     return m_DM;  
  34. }  
  35.   
  36. void CMyDM::init() {  
  37.     // 实例化COM组件对象  
  38.     bool rst = m_DM->setControl(QString::fromUtf8("{26037A0E-7CBD-4FFF-9C63-56F2D0770214}"));  
  39.     if (!rst) {  
  40.         // COM组件还未在系统注册,注册dm.dll,需要当前exe程序以管理员权限运行  
  41.         qDebug("Reg dm.dll");  
  42.   
  43.         RegDllByCmd("dm.dll");  
  44.         rst = m_DM->setControl("{26037A0E-7CBD-4FFF-9C63-56F2D0770214}");  
  45.         if (!rst) {  
  46.             QMessageBox::critical(NULL, "友情提示""DLL没有注册!", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);  
  47.             exit(-1);  
  48.         }  
  49.     }  
  50.     m_bNeedClear = true;  
  51. }  
  52.   
  53. int CMyDM::deInit() {  
  54.   
  55.     if (m_bNeedClear)  
  56.     {  
  57.         m_DM->clear();  
  58.         m_DM->destroyed();  
  59.         m_DM = NULL;  
  60.         return 0;  
  61.     }  
  62.     return -1;  
  63. }  
  64.   
  65.   
  66. void CMyDM::RegDllByCmd(QString dllName)  
  67. {  
  68.     QString path;  
  69.     path = QCoreApplication::applicationDirPath();//获取程序运行路径    
  70.     QString cmdStr = "Regsvr32 " + path + "/dm.dll /s";  
  71.     QProcess p(0);  
  72.     p.start("cmd", QStringList() << "/c" << cmdStr);  
  73.     p.waitForStarted();  
  74.     p.waitForFinished();  
  75. }  
原文:http://blog.csdn.net/qing666888/article/details/77146073?locationNum=4&fps=1
原创粉丝点击