dll可以让我们将部分功能封装起来,模块化,有效的避免了当功能模块某一部分出问题,或者需要修改的时候,不得不去重编译整个项目的问题,还可以被其它程序使用。
基础类(用于提供接口):
#ifndef TOOLMANAGEBASE_H
#define TOOLMANAGEBASE_H
#include <QString>
#include <QLibrary>
//工具管理类
class ToolManageBase
{
public:
virtual int RunTool(QString strtoolname,QString cmd = "") = 0; //运行工具
virtual int CloseAllTool() = 0; //关闭所有工具
virtual int CheckToolNum(QString toolguid) = 0; //指定工具类型的运行数量
virtual int GetToolTypeNumber() = 0; //返回工具的种类
};
#endif // TOOLMANAGE_H
具体实现类:
.h文件
/*************************************************************
*文件名:toolmanage.h
*内容摘要:工具管理类头文件
*************************************************************/
#ifndef TOOLMANAGE_H
#define TOOLMANAGE_H
#include <QString>
#include <list>
#include <QProcess>
#include "tool.h"
#include <QDomDocument>
#include <QTextStream>
#include <QFile>
#include "../include/toolmanagebase.h"
#include "toolmanage_global.h"
typedef struct toolinfor
{
QString name;
QString guid;
QString path;
int type;
} ToolInfor;
//工具管理类
class Toolmanage : public ToolManageBase
{
public:
Toolmanage(); //构造函数
int RunTool(QString toolguid,QString cmd = ""); //运行工具
int CloseAllTool(); //关闭所有工具
int CheckToolNum(QString toolguid); //查看工具类型
int GetToolTypeNumber(); //查看工具类型数量
private:
void readtoolinfor(QString path); //读取工具信息
std::list<Tool> m_tools_list; //工具进程管理链表
std::list<ToolInfor> m_toolsinfor_list;
};
//用于获取对象
extern "C" TOOLMANAGESHARED_EXPORT ToolManageBase* getInstance()
{
return new Toolmanage();
}
#endif // TOOLMANAGE_H
dll全局文件:
#ifndef TOOLMANAGE_GLOBAL_H
#define TOOLMANAGE_GLOBAL_H
#include <QtCore/qglobal.h>
#if defined(TOOLMANAGE_LIBRARY)
# define TOOLMANAGESHARED_EXPORT Q_DECL_EXPORT
#else
# define TOOLMANAGESHARED_EXPORT Q_DECL_IMPORT
#endif
#endif // TOOLMANAGE_GLOBAL_H
加载:
最好使用绝对路径或者相对路径来寻找dll,防止因路径出错而加载失败
typedef ToolManageBase* (*Fun)();
m_mylib = new QLibrary(QApplication::applicationDirPath() + "\\toolmanage.dll");
if(m_mylib->load())
{
Fun pfun= (Fun)m_mylib->resolve("getInstance");
m_toolmanage = pfun();
}
else
//失败要进行提示
使用:
int ToolManage::GetToolTypeNumber()
{
if(m_toolmanage != NULL)
{
return m_toolmanage->GetToolTypeNumber();
}
else
return -1;
}
卸载:
if(m_toolmanage != NULL)
m_toolmanage->CloseAllTool();
if(m_mylib!= NULL)
{
m_mylib->unload();
delete m_mylib;
}