
私は昔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で質問しましょう!
似たような質問が見つかりました
- Windows 10 IT初心者です! powershellで以下のようなエラーが出ました オブジェクト参照がオブジェクト 1 2023/05/17 11:30
- Visual Basic(VBA) VBプロジェクトでのフォルダ構成について 1 2023/07/22 03:49
- その他(プログラミング・Web制作) Pythonで複数のメソッドをまとめて管理する方法について 1 2023/03/30 00:01
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- その他(プログラミング・Web制作) IT初心者です 仕事で、vb.netで作成されたdllをvbaで呼び出すプログラムを作成しろと言われ 1 2023/03/27 08:22
- Excel(エクセル) 別シートに毎回異なるデータをコピーする 7 2022/06/24 09:02
- 学校 うちの学校では1.2.3と3つのクラスがあり数学の授業の際はAクラスとBクラスに分かれるのですがプリ 1 2022/06/23 19:19
- 幼稚園・保育所・保育園 どちらのこども園にするか迷っています 1 2022/11/28 00:12
- MySQL 下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「名前(first name) 1 2023/06/24 13:03
- 友達・仲間 仲良くしてたグループでハブられたらどうしますか? 長文失礼します。 高3女子です。 3年のクラスにな 6 2022/06/06 21:35
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VisualStudio2022でC言語プログ...
-
逆コンパイルと逆アセンブルの...
-
c言語
-
CPUが16bitでも32bitOSでコンパ...
-
gccを行ってもexeファイルが生...
-
C++でデスクトップGUIアプリ開...
-
大量のデータを読み込んで表示...
-
c言語でイベントフラグを使った...
-
Windows Formアプリからコンソ...
-
visual studio 2022でのC#プロ...
-
c#のTLS1.2での通信について
-
プログラミング言語でアプリや...
-
プログラムの実行時に'<'でリダ...
-
終端記号、非終端記号とは
-
gcc13.2のバグ?
-
写真のプログラムは、1からnま...
-
変数名を引数として渡す、アド...
-
ポインタの宣言方法
-
VisualStudioでC++クラスを追加...
-
C言語の関数のextern宣言
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
イベントにAddHandlerされてい...
-
ダイアログ表示時にチェックボ...
-
エディットコントロールでEnter...
-
(UWSC) 「#32770」の意味わかり...
-
C++ protectedにアクセス不可
-
クラスのアドレスを引数として...
-
エディットコントロールのイベ...
-
【ASP.NET】 独自で作成したク...
-
MFCのドラッグ&ドロップについて
-
オーバーライド関数の呼び出し...
-
C++/CLIからC++の呼び出しで例外
-
ボタンのオーナードローについて
-
C++で継承元のクラスの代入演算...
-
MFCアプリのコマンドラインでパ...
-
DLLからEXEのクラスを呼び出す...
-
MFCのCListCtrlでスクロールを検出
-
オブジェクト指向 集約の実装...
-
ダイアログクラスのコントロー...
おすすめ情報