dポイントプレゼントキャンペーン実施中!

私は昔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++です。

よろしくお願いします。

A 回答 (3件)

EXEの中のクラス定義を DLL側にヘッダーのみしか使わないとその実態が無いことになってしまいます



VC++のメニューで プロジェクト > プロパティ > 構成のプロパティ > リンカ > 追加の依存ファイルに
ERRクラスで生成されたObjファイルを指示してみましょう

次に依存関係を設定しておいたほうがいいでしょう
Bプロジェクトは AプロジェクトのERRクラスに依存しているのですから
Aプロジェクトを先に構築しないと ERRクラスのOBJファイルが生成できません
プロジェクト > プロジェクト依存関係 で プロジェクト(R)をBプロジェクト > 依存先(D)で Aプロジェクト にチェック
としましょう

Cプロジェクトの方も同じですね
プロジェクト(R)を Cプロジェクト
依存先(D)を Bプロジェクト
にします

Cプロジェクトの 追加の依存ファイルに BプロジェクトのLibファイルを追加しましょう
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/12/26 07:32

>何が足りないのでしょうか?


DLL側にERRクラスの実体が無いからでしょう。


>dllからexeのクラスを呼び出すようなことはできないのでしょうか?
そもそも、モジュール化を考えるならEXE側で呼び出すものを
DLLに実装すべきであり、DLLに実装すれば他のEXEからでも
呼び出せるはずです。
EXE側に実装する理由は何でしょうか?

>このやり方自体に問題があり、他の方法にする方がいいですか?
問題があるかどうかは定かではありませんが、
私なら、DLLに実装してそれを使うと思います。

>objの場合はどのような追加になるのでしょうか?
>プロジェクトのプロパティか何かでするのでしょうか?
リンクの設定で****.libのある場所に追加したいオブジェクトの
ファイル名を****.objのように追加してオブジェクトファイルを
プロジェクトファイルから見えるパスに置けばリンクできたはずです。
    • good
    • 0
この回答へのお礼

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

参考意見ありがとうございました。

お礼日時:2008/12/26 07:36

DLL側にERRクラスが無いとダメですよ


ERRクラス関連の objまたはソースが必要でしょう
    • good
    • 0
この回答へのお礼

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

objの場合はどのような追加になるのでしょうか?
プロジェクトのプロパティか何かでするのでしょうか?

お礼日時:2008/12/23 18:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!