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