解决DLL Hell的方式 Dll导出类

本文介绍两种禁止外部直接继承和创建类实例的方法:一是通过类的静态成员函数使用智能指针生成实例;二是通过DLL暴露的外部函数创建和销毁实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

禁止外部继承导出类和直接生成类的实例,通过DLL内存生成类的实例

1.通过类的静态成员函数导出类的实例

  定义一个静态成员函数用来生成类的实例,上代码:

#pragma once
#include <memory>
#ifdef TRANSIMG_API
#define  TRANSIMG __declspec(dllexport)
#else
#define  TRANSIMG __declspec(dllimport)
#endif


class TRANSIMG TransImgDllAPI
{
protected:
	TransImgDllAPI();	
public:	
	static std::shared_ptr<TransImgDllAPI> NewInstance();//利用智能指针生成类的实例
	//static void DestoryInstance(TransImgDllAPI *);

	virtual ~TransImgDllAPI();
	//磁盘类型  0 ext   1 ntfs    2 fat32    3 fat
	virtual int GetState(CString strAdd) = 0; 
	virtual int GetState(LONGLONG llPageBeg) = 0;

	//初始化
	virtual int CheckInit(LPCTSTR sFile) = 0;
	//关闭
	virtual int CeckClose() = 0;
	
};

实现:

std::shared_ptr<TransImgDllAPI>  TransImgDllAPI::NewInstance()
{
	std::shared_ptr<TransImgDllAPI>  ppp(new CCheckSystem());
	return ppp;
}

调用:

std::shared_ptr<TransImgDllAPI> ppp = TransImgDllAPI::NewInstance();
ppp->CheckInit(_T("E:\\测试库\\华为G510-0010-照片成功.img"));

2.通过外部函数生成类的实例,上代码

#pragma once
#include <memory>
#ifdef TRANSIMG_API
#define  TRANSIMG __declspec(dllexport)
#else
#define  TRANSIMG __declspec(dllimport)
#endif


class TransImgDllAPI
{
protected:
	TransImgDllAPI();	
public:	
	//static std::shared_ptr<TransImgDllAPI> NewInstance();
	//static void DestoryInstance(TransImgDllAPI *);

	virtual ~TransImgDllAPI();
	//磁盘类型  0 ext   1 ntfs    2 fat32    3 fat
	virtual int GetState(CString strAdd) = 0; 
	virtual int GetState(LONGLONG llPageBeg) = 0;

	//初始化
	virtual int CheckInit(LPCTSTR sFile) = 0;
	//关闭
	virtual int CeckClose() = 0;
	
};

extern "C" TRANSIMG TransImgDllAPI * __stdcall NewInstance();
extern "C" TRANSIMG void __stdcall DestroyInstance(TransImgDllAPI *p);

实现:

extern "C" TransImgDllAPI * __stdcall NewInstance()
{
	return new CCheckSystem();
}

extern "C" void __stdcall DestroyInstance(TransImgDllAPI *p)
{
	if (p)
	{
		delete p;
		p = NULL;
	}
}

调用:

TransImgDllAPI *ppp = NewInstance();
ppp->CheckInit(_T("E:\\测试库\\华为G510-0010-照片成功.img"));
DestroyInstance(ppp);


    




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值