• ベストアンサー

DLLからEXEのクラスを呼び出すとリンクエラーになります。

私は昔VC++6.0を少し触っただけの初心者に近い状態のレベルです。 作っているプログラムは、1つのソリューションの中にEXE実行するプロジェクトとDLLを作るプロジェクトの2つプロジェクトを含んでいます。 DLL側からEXEのクラスを使用すると、ビルド時にリンクエラーになります。LNK2019でシンボルのエラーなのですが、なぜそうなのか?がわかりません。 ご教授いただけますでしょうか。 <ソリューションの構成> A ソリューション  Aプロジェクト(.exe) AAクラス ERR親クラス ← ERR子クラスの継承 Bプロジェクト(.dll) 静的リンク(.defファイル使用) BAクラス BAクラスの実装 {  try {   throw ERR子クラス } catch(ERR子クラス) { } } やりたいことは、BプロジェクトにあるERR子クラスをBプロジェクトと Cプロジェクトの両方で使用したいです。 ビルド時に上のBAクラスのERR子クラスのところでコンパイルはとおるのですが、リンクエラーになります。エラーコードはLNK2019です。 何が足りないのでしょうか? dllからexeのクラスを呼び出すようなことはできないのでしょうか? このやり方自体に問題があり、他の方法にする方がいいですか? ERR親クラス、ERR子クラスともヘッダー定義があり。 CAクラスのヘッダー定義内でinclude宣言しています。 versionはVC2003++です。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

EXEの中のクラス定義を DLL側にヘッダーのみしか使わないとその実態が無いことになってしまいます VC++のメニューで プロジェクト > プロパティ > 構成のプロパティ > リンカ > 追加の依存ファイルに ERRクラスで生成されたObjファイルを指示してみましょう 次に依存関係を設定しておいたほうがいいでしょう Bプロジェクトは AプロジェクトのERRクラスに依存しているのですから Aプロジェクトを先に構築しないと ERRクラスのOBJファイルが生成できません プロジェクト > プロジェクト依存関係 で プロジェクト(R)をBプロジェクト > 依存先(D)で Aプロジェクト にチェック としましょう Cプロジェクトの方も同じですね プロジェクト(R)を Cプロジェクト 依存先(D)を Bプロジェクト にします Cプロジェクトの 追加の依存ファイルに BプロジェクトのLibファイルを追加しましょう

isakitsusi
質問者

お礼

依存ファイルにobjを指示することにしました。 それぞれにソースを置くとファイルの 修正が手間なので。 依存関係を確かめて問題ありませんでした。 解決しました。ありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.3

>何が足りないのでしょうか? DLL側にERRクラスの実体が無いからでしょう。 >dllからexeのクラスを呼び出すようなことはできないのでしょうか? そもそも、モジュール化を考えるならEXE側で呼び出すものを DLLに実装すべきであり、DLLに実装すれば他のEXEからでも 呼び出せるはずです。 EXE側に実装する理由は何でしょうか? >このやり方自体に問題があり、他の方法にする方がいいですか? 問題があるかどうかは定かではありませんが、 私なら、DLLに実装してそれを使うと思います。 >objの場合はどのような追加になるのでしょうか? >プロジェクトのプロパティか何かでするのでしょうか? リンクの設定で****.libのある場所に追加したいオブジェクトの ファイル名を****.objのように追加してオブジェクトファイルを プロジェクトファイルから見えるパスに置けばリンクできたはずです。

isakitsusi
質問者

お礼

ありがとうございます。 本当はDLL実装なんでしょうね。 EXEからDLLにフッキングするものでEXEの初期処理時から メッセージを出したかったんです。 DLLにフッキングするのは初期処理終了後のタイミングなので。 でも静的リンクならDLLにおいても問題ないのかな・・・。 参考意見ありがとうございました。

すると、全ての回答が全文表示されます。
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

DLL側にERRクラスが無いとダメですよ ERRクラス関連の objまたはソースが必要でしょう

isakitsusi
質問者

お礼

回答ありがとうございます。 ERRクラスがないとだめなんですね。 DLL側のプロジェクトにソースを追加するのは やってみて動かしています。 しかし、同じソースを2箇所で埋めているのはどうかなと いうことで1箇所(Aプロジェクト側)で見れるように なる方法が他の言語では共有して参照できるらしい事を 聞いたので他に方法がないのかなと思って質問しました。 objの場合はどのような追加になるのでしょうか? プロジェクトのプロパティか何かでするのでしょうか?

すると、全ての回答が全文表示されます。

関連するQ&A