クラスをエクスポートするDLLの作り方

static リンクで、new しないで使うようにすると、
DLL に変更を加えたときに、アプリもビルドしなおさないといけない。



(VS2005) STLクラスからの派生クラスを__declspec(dllexport)する場合の警告について
http://msdn.microsoft.com/ja-jp/library/esew7y1w(v=vs.80).aspx



DLL 側

ExportClass.h

class ExportClass
{
public:
	virtual void Func(void) = 0;
	virtual void Destroy(void) = 0;
};
 
extern "C" __declspec(dllexport) ExportClass* CreateExportClassInstance(void);
 

ExportClassImp.h

#include "ExportClass.h"
 
class ExportClassImp : public ExportClass
{
public:
	// 面倒なのでインライン
	ExportClassImp() { }
	void Func(void)
	{
		// 処理
	}
	void Destroy(void)
	{
		delete this;
	}
};
 

ExportClass.cpp

#include "ExportClass.h"
#include "ExportClassImp.h"
 
BOOL APIENTRY DllMain()
{
	// 省略
}
 
__declspec(dllexport) ExportClass* CreateExportClassInstance(void)
{
	return new ExportClassImp;
}
 


アプリ側

ExportClass.h

class ExportClass
{
public:
	virtual void Func(void) = 0;
	virtual void Destroy(void) = 0;
};
 
extern "C" __declspec(dllimport) ExportClass* CreateExportClassInstance(void);
 

ImportApp.cpp

#include "ExportClass.h"
 
typedef ExportClass* (*tagCreateExportClassInstance)(void);
 
void ImportFunction(void)
{
	HMODULE hDLL = ::LoadLibrary(_T("ExportClass.dll"));
	if (hDLL == NULL) {
		// error
	}
 
	tagCreateExportClassInstance create_func
		= (tagCreateExportClassInstance)::GetProcAddress(hDLL, "CreateExportClassInstance");
	if (create_func == NULL) {
		// error
	}
 
	// ExportClass インスタンスの生成
	ExportClass *export_class = create_func();
 
	// クラスメソッドの使用
	export_class->Func();
 
 
	export_class->Destroy();
 
	::FreeLibrary(hDLL);
 
	return 0;
}
 
最終更新:2011年10月27日 00:47
添付ファイル