在工程实现中,经常会需要将实现特定共功能的算法程序封装成.dll或.so动态库的形式供可执行程序调用。为了保护程序的实现不暴露给调用方,可通过继承接口类的形式进行封装,编译生成后只提供.dll或.so文件和接口类声明头文件即可。
动态库封装的实现
接口类头文件
//接口头文件dlltest1.h
#pragma once
#ifdef DLLTEST1_EXPORTS
#define DLL_EXPORTS __declspec(dllexport)
#else
#define DLL_EXPORTS __declspec(dllimport)
#endif
class DLL_EXPORTS DllTest1
{
public:
virtual void AddFunc(int a, int b) = 0;
virtual int GetRes() = 0;
};
DLL_EXPORTS DllTest1* CreateDllTest();//用于创建具体实现类的实例
具体实现类头文件
//具体实现类头文件dlltest1imp.h
#pragma once
#include "dlltest1.h"
class DllTest1Imp : public DllTest1 //继承接口类
{
public:
void AddFunc(int a, int b) override;//override说明该函数为重写的父类成员函数
int GetRes() override;
private:
int m_nRes;
};
具体实现定义
#include "dlltest1imp.h"
using namespace std;
void DllTest1Imp::AddFunc(int a, int b)
{
m_nRes = a + b;
}
int DllTest1Imp::GetRes()
{
return m_nRes;
}
DllTest1* CreateDllTest()
{
return new DllTest1Imp();//创建具体实现类实例并赋值给父类指针
}
注意:
在dll工程的“属性”–》“C/C++”–》“预处理器”–》“预处理器定义”,添加DLLTEST1_EXPORTS,与接口头文件的宏定义相同
调用方可执行程序实现
调用方只需要使用dlltest1.h、Dlltest1.lib、Dlltest1.dll即可进行集成
//控制台程序testdlltest1.cpp
#include <iostream>
#include"dlltest1.h"
using namespace std;
int main()
{
DllTest1* test = CreateDllTest();
test->AddFunc(12, 13);
cout << test->GetRes() << endl;
delete test;
return 0;
}
调用方工程配置:
附加依赖项Dlltest1.lib
将Dlltest1.dll与可执行文件的.exe放在同一目录下即可