QT调用dumpcpp.exe让Active、dll生成.h.cpp

在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.   

  1. }; 
    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  这是原文链接 大佬厉害

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值