dllの明示的リンクでC++のクラスを使用する方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
みずほ

dllの明示的リンクでC++のクラスを使用する方法

#1

投稿記事 by みずほ » 13年前

dllの明示的リンクでCの関数ではなく、クラス自体を使用する方法を探しています。
何年か前にどこかのサイトで以下のソースのような方法を見つけ、テストで作成したところ問題なく動作したのを覚えています。

最近そのサイトを再度探したところ、見つからなかったのですが以下のような明示的リンクでクラスを使用する方法は問題ないのでしょうか?
動作したので、動くことは確認できましたが、仕組みがいまいち分らないので不安なところがあります。

これは、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();
	
}



ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: dllの明示的リンクでC++のクラスを使用する方法

#2

投稿記事 by ISLe » 13年前

あまり見たことがないのでメジャーかどうかは分かりませんが、これ以外に方法がないということは言えるかもしれません。

EXEとDLLはヒープが別管理なので、new/deleteは必ずDLL側で行うということ以外に、メンバ関数はすべて仮想関数である必要があります。

COMのインターフェースも実装としては同じなので動作上の問題はないと思います。

tk@mbphone

Re: dllの明示的リンクでC++のクラスを使用する方法

#3

投稿記事 by tk@mbphone » 13年前

tkmakwins15です。旧式携帯でのアクセスなので、名前がいつもと違いますがご了承ください。

DLLを使う側は、純粋仮想関数のみを持つクラス(つまり、インターフェースクラス)を通してオブジェクトにアクセスするようにしたほうがいいです。そうしておけば、DLL側に変更があっても、EXE側を変更する必要がなくなります。

みずほ

Re: dllの明示的リンクでC++のクラスを使用する方法

#4

投稿記事 by みずほ » 13年前

返信ありがとうございます。 大変参考になるキーワードを教えていただいて、たいへん参考になりました。
現在、DLL、 純粋仮想関数をキーワードに関連サイトを見て勉強させていただいています。

DLL作成後のメンバー変数の追加、ソースの修正など内部処理の変更を考慮して設計をおこないたいと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る