现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

一种C++ DLL接口封装的基本方法

2015-07-31 15:48 工业·编程 ⁄ 共 1622字 ⁄ 字号 暂无评论

在产品开发过程中,我们经常会需要对外提供DLL的接口,这种接口可以在产品开是设计好的,也可能是在基本功能开发完成进行封装的,这里将介绍一种比较基本常用的封装方法,供初学者参考。欢迎提出好的改进方式。

先提几点要求,包含我们的目标、要求和本文范围等,

  • 1、对外提供的文件清晰,只包含必需的头文件、DLL文件及LIB文件
  • 2、不暴露用户不需要知道的多余信息
  • 3、这里只设计封装过程与思路,包含DLL相关的实现以及代码工程配置等信息

首先你可以先配置好你想发布的目录文件夹,

例如:包含三个对外发布的文件夹,名称分别为BIN、INCLUDE、LIB,BIN里放发布所需要的DLL,INCLUDE只存放发布的头文件,LIB文件夹里放生成的LIB文件

你的实现的工程文件放在工程文件夹里就可以了

//---------------------接口文件 IMyDLL.h ------  //这个文件应该放在对外发布的INCLUDE文件下,供外部使用

// 这个是对外发布的接口,这个文件里只包含对外提供的方法,不会包含私有方法和属性

class IMyDLL        // 这个类是对外发布的,所有方法均是纯虚的,不会暴露实现

{

public:

     virtual void Init() = 0;  // 纯虚的,对外的都是纯虚的

//  privata:

//  int a;          // 这样的属性不是对外发布的,就不把它放在对外接口头文件里

}

//-------------------实现文件 MyDLLImpl.h --------

//继承IMyDLL

#include "IMyDLL.h"  // 这个是具体实现的类,放在工程文件目录下就可以了,不需要对外发布

class CMyDLLImpl : public IMyDLL   // 从对外接口类继承,负责具体实现

{

public:

      virtual void Init(); // 如果还设计为可被继承,就写成虚的,不是虚的普通方法也可以,这个地方有个是否使用虚析构的问题,要注意,不明白的话认真查下资料

privata:

      int a; //这个地方可以有,因为用户看不见

}

//-----------------实现文件 MyDLLImpl.cpp -------- // 这个是方法实现文件,没有什么好说的,放在工程目录下

#include "MyDLLImpl.h"

void CMyDLLImpl::Init() 

{

  ;  //真正实现的代码

//  这里可以使用声明过的变量a

}

上面的就是整个封装的框架,下面是最重要的一步,提供用户创建对象的方法,因为前面对外发布的为抽象类,用户不能创建实例,所以:

// MyDllFactory.h // 对外发布

#include "IMyDLL.h"

class MyDllFactory

{

  IMyDLL* Create();  // 提供一个创建对象的方法      

}

// MyDllFactory.cpp

#include "MyDllFactory.h"

#include "MyDLLImpl.h"   // 注意这个很重要,由于是在CPP里,

IMyDLL* MyDllFactory::Create()

{

return new CMyDLLImpl;

}

MyDllFactory类也可以写到对外接口的头文件中,因为这里只有1个方法,可以减少维护的文件数据,我经常把它和接口头文件写在一起。

对象的创建方法可能会有很多,可以根据实现情况进行修改,比如使用工厂模式、对象工厂等方法。

这样封装过程就完了,提供给用户的是MyDllFactory.h、IMyDLL.h、DLL文件和LIB文件

对外提供的文件中看不到任何多余的东西,用户调用的过程大概是这样的:

#include "MyDllFactory.h"

void f()

{

MyDllFactory factory;

IMyDLL* pDll = factory.Create();  //这样就创建出对象了

pDll ->Init();

}

给我留言

留言无头像?