人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

DLLのなかのC++のクラスを利用する方法を教えてください。
DLL、およびそのDLLを使用するEXE両方を開発しています。(WindowsXPでVisualC++6.0)

DLLにはクラスのインスタンスがあり、そのポインタを返す関数(A)だけをExportしています。
EXEでは、DLL(LoadLibrary APIを使用して動的に呼び出しています)の関数(A)から、クラスのインスタンスのポインタを取得して利用します。
DLLで使用しているクラスのヘッダをそのまま使用すると、Lnkerがエラーをだすので、EXE側では 「virtual メソッド名 =0;」として純粋仮想関数へと書き換えたヘッダを利用しています。
他は特にプラグマなどは指定していません。

上記の状態で、DLLから取得したインスタンスを利用すると変数の利用は問題なくできるのですが、メソッドを呼び出そうとすると例外が発生します。vTableを値をメモリダンプでみてみると全然違うアドレスがはいっている(なんか文字列のワークっぽい)のでメソッド呼び出し時に不正なアドレスを呼び出しているようです。

このような利用方法を行う場合、どのようにするのが正しいでしょうか?


●質問者: fslasht
●カテゴリ:コンピュータ インターネット
✍キーワード:API C++ DLL exe WindowsXP
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● KUROX
●20ポイント

http://www2s.biglobe.ne.jp/~ragnarok/program/win32/class_of_cpp_...

◎質問者からの返答

回答ありがとうございます。

このサイトを参考にやってみます。

でもこの方法だと、libファイルをつかって暗黙的にリンクするしかないんですよね。

明示的にリンクする方法はないでしょうか。


2 ● flashrod
●40ポイント ベストアンサー

>EXE側では 「virtual メソッド名 =0;」として純粋仮想関数へと書き換えたヘッダを

DLL側でもこの同じ書き換えたヘッダファイルを利用しないといけないのではないでしょうか。

たぶん、OLE2のCOMみたいなことをしようとしておられるようなので、原理的には可能なはずだと思います。

#Windowsプログラミングはもう何年もしてないので外してる可能性大ですが。

◎質問者からの返答

回答ありがとうございます。

DLL内でも実体のクラスも純粋仮想クラスから派生するようにしたところうまくいきました。

以下注意点のメモ

【注意点】

・純粋仮想クラスのコントラスタは普通作らない

・純粋仮想クラスのデストラクタは、純粋仮想メソッドにしない(=0はつけない)。また、空の実装をつけとく。

例)

virtual ~TestClass() {};

※これをわすれたら、vtableが1個づつづれて難儀しました。

・DLL内でインスタンスを持つ場合は、sharedセグメントに置く

例) dll.cppに追加

#pragma data_seg(".shared")

TestClass test;

#pragma data_seg()

例) dll.defに追加

SECTIONS

.shared READ WRITE SHARED


3 ● q_taro4
●20ポイント

http://hp.vector.co.jp/authors/VA019517/howtodll.html

◎質問者からの返答

回答ありがとうございます。

リンク先のページ参考にさせていただきました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ