在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组件资源的方法。代码如下:
- #pragma once
- #include "dm.h"
- using namespace Dm;
- class CMyDM
- {
- public:
- CMyDM();
- ~CMyDM();
- /// 获取类的实例
- static Idmsoft* GetIns();
- /// 清理COM接口,main函数返回前,应确保调用此方法,否则可能引起内存泄漏
- static int deInit();
- private:
- /// 初始化COM组件
- static void init();
- static void RegDllByCmd(QString dllName);
- };
-
- #include "MyDM.h"
- #include <QMessageBox>
- #include <QDir>
- #include <QProcess>
- #include <QAxWidget> //需在Pro文件中添加
- #include <qdebug.h>
- #include <QtWidgets/QApplication>
- #pragma execution_character_set("utf-8")
- Idmsoft* m_DM;
- bool m_bNeedClear;
- CMyDM::CMyDM()
- {
- m_DM = NULL;
- m_bNeedClear = false;
- }
- CMyDM::~CMyDM()
- {
- deInit();
- }
- Idmsoft* CMyDM::GetIns()
- {
- if (m_DM == NULL)
- {
- qDebug("new CFZCB");
- m_DM = new Idmsoft();
- init();
- }
- return m_DM;
- }
- void CMyDM::init() {
- // 实例化COM组件对象
- bool rst = m_DM->setControl(QString::fromUtf8("{26037A0E-7CBD-4FFF-9C63-56F2D0770214}"));
- if (!rst) {
- // COM组件还未在系统注册,注册dm.dll,需要当前exe程序以管理员权限运行
- qDebug("Reg dm.dll");
- RegDllByCmd("dm.dll");
- rst = m_DM->setControl("{26037A0E-7CBD-4FFF-9C63-56F2D0770214}");
- if (!rst) {
- QMessageBox::critical(NULL, "友情提示", "DLL没有注册!", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
- exit(-1);
- }
- }
- m_bNeedClear = true;
- }
- int CMyDM::deInit() {
- if (m_bNeedClear)
- {
- m_DM->clear();
- m_DM->destroyed();
- m_DM = NULL;
- return 0;
- }
- return -1;
- }
- void CMyDM::RegDllByCmd(QString dllName)
- {
- QString path;
- path = QCoreApplication::applicationDirPath();//获取程序运行路径
- QString cmdStr = "Regsvr32 " + path + "/dm.dll /s";
- QProcess p(0);
- p.start("cmd", QStringList() << "/c" << cmdStr);
- p.waitForStarted();
- p.waitForFinished();
- }