使用动态库进行程序封装的一种方法(C++,详细实例)

在工程实现中,经常会需要将实现特定共功能的算法程序封装成.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放在同一目录下即可

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懒人空想家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值