
私は昔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++です。
よろしくお願いします。
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ファイルを追加しましょう
依存ファイルにobjを指示することにしました。
それぞれにソースを置くとファイルの
修正が手間なので。
依存関係を確かめて問題ありませんでした。
解決しました。ありがとうございます。
No.3
- 回答日時:
>何が足りないのでしょうか?
DLL側にERRクラスの実体が無いからでしょう。
>dllからexeのクラスを呼び出すようなことはできないのでしょうか?
そもそも、モジュール化を考えるならEXE側で呼び出すものを
DLLに実装すべきであり、DLLに実装すれば他のEXEからでも
呼び出せるはずです。
EXE側に実装する理由は何でしょうか?
>このやり方自体に問題があり、他の方法にする方がいいですか?
問題があるかどうかは定かではありませんが、
私なら、DLLに実装してそれを使うと思います。
>objの場合はどのような追加になるのでしょうか?
>プロジェクトのプロパティか何かでするのでしょうか?
リンクの設定で****.libのある場所に追加したいオブジェクトの
ファイル名を****.objのように追加してオブジェクトファイルを
プロジェクトファイルから見えるパスに置けばリンクできたはずです。
ありがとうございます。
本当はDLL実装なんでしょうね。
EXEからDLLにフッキングするものでEXEの初期処理時から
メッセージを出したかったんです。
DLLにフッキングするのは初期処理終了後のタイミングなので。
でも静的リンクならDLLにおいても問題ないのかな・・・。
参考意見ありがとうございました。
No.1
- 回答日時:
DLL側にERRクラスが無いとダメですよ
ERRクラス関連の objまたはソースが必要でしょう
回答ありがとうございます。
ERRクラスがないとだめなんですね。
DLL側のプロジェクトにソースを追加するのは
やってみて動かしています。
しかし、同じソースを2箇所で埋めているのはどうかなと
いうことで1箇所(Aプロジェクト側)で見れるように
なる方法が他の言語では共有して参照できるらしい事を
聞いたので他に方法がないのかなと思って質問しました。
objの場合はどのような追加になるのでしょうか?
プロジェクトのプロパティか何かでするのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Vba Replace関数について教えて...
-
CSSが全く分かりません、お助け...
-
CPUが16bitでも32bitOSでコンパ...
-
最初に聞かれたこと
-
DLLファイルの逆コンパイラにつ...
-
C言語 関数、変数の宣言について
-
C言語でファクト関数を使わずに...
-
あってる
-
DNCL(共テ用プログラミング言語...
-
バッチファイルで以下のような...
-
visual studio 2022でのC#プロ...
-
プログラミングc++を全く分か...
-
DNCL(共テ用プログラミング言語...
-
C言語 配列と関数の練習問題
-
gccを行ってもexeファイルが生...
-
c言語
-
VisualStudio2022でC言語プログ...
-
ストリームについて。
-
Cのオブジェクトファイルの逆ア...
-
Windows Formアプリからコンソ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
既定のコンストラクタがない?
-
FriendとPublicの違い。。。
-
(UWSC) 「#32770」の意味わかり...
-
ダイアログ表示時にチェックボ...
-
イベントにAddHandlerされてい...
-
エディットコントロールでEnter...
-
オーバーライド関数の呼び出し...
-
このコンパイルエラーの意味に...
-
【ASP.NET】 独自で作成したク...
-
MFC モードレスDlgについて
-
[MFC] CWnd::MessageBoxの警告...
-
ボタンのオーナードローについて
-
MessageBoxを継承したい
-
ダイアログクラスのコントロー...
-
vba sendKeysを送る相手のソフ...
-
エディットコントロールのイベ...
-
Delphi6 DLL内でのメモリ共有(?)
-
個々の関数について継承してい...
-
privateなメンバ関数をテストす...
-
WindowsAPIのリストビューの...
おすすめ情報