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

工具下载:

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+QT5.9.1使用大漠插件(COM组件)_第1张图片


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文件。

VS2017+QT5.9.1使用大漠插件(COM组件)_第2张图片


就会在当前文件夹下生成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 
#include   
#include   
#include   //需在Pro文件中添加  
#include 
#include 

#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();
}




你可能感兴趣的:(QT)