何年か前にどこかのサイトで以下のソースのような方法を見つけ、テストで作成したところ問題なく動作したのを覚えています。
最近そのサイトを再度探したところ、見つからなかったのですが以下のような明示的リンクでクラスを使用する方法は問題ないのでしょうか?
動作したので、動くことは確認できましたが、仕組みがいまいち分らないので不安なところがあります。
これは、dllのCreateInstance関数がdll内でDllClassのインスタンスを作成してメインプログラム側で、それを使いまわすと自分では思っています。
基本、明示的リンクのdllではクラスが使用できないので、この方法はメジャーな方法なのでしょうか?
■dll内のソース
・ヘッダー
class DllClass {
public:
vitual int Hoge();
public:
friend DllClass* CreateInstance();
friend void ReleseInstance(DllClass* p);
};
DllClass* CreateInstance();
void ReleseInstance(DllClass* p)
・ソース
int DllClass:Hoge() {
return 10;
}
DllClass* CreateInstance() {
return new DllClass ;
}
void ReleseInstance(DllClass* p) {
delete p;
}
■exe側のソース
typedef DllClass* (__cdecl *CreateInstance_)();
CreateInstance_ CreateInstance_dll;
int main()
{
HMODULE hDll = ::LoadLibrary("dllパス");
CreateInstance_dll = (CreateInstance_)GetProcAddress(hDll, "CreateInstance");
//dllで作成したクラスインスタンスを作成する
DllClass* pDllClass =CreateInstance_dll();
int val = pDllClass->Hoge();
}