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