解決DLL Hell的方式 Dll導出類

禁止外部繼承導出類和直接生成類的實例,通過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);


    




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章