MFCで別々のプロジェクト内で作成したダイアログを表示する方法

このQ&Aのポイント
  • VC++2005のMFCを使用してアプリケーションを作成しています。一つのソリューション内にプロジェクトAとプロジェクトBがあり、プロジェクトAのイベントでプロジェクトBで作成したダイアログを表示したいと考えています。しかし、コンパイルエラーが発生しています。「error C2065: 'IDD_TEST2_DIALOG' : 定義されていない識別子です。」というエラーメッセージです。
  • プロジェクトAの依存先をプロジェクトBに設定し、プロジェクトAのプロパティの追加のインクルードディレクトリにプロジェクトBのパスを指定しています。しかし、正しい設定方法や実装方法が分からず、エラーが発生しています。
  • プロジェクトAのボタンがクリックされたときに、CDlgTestという名前のダイアログを生成するコードが記述されています。しかし、定義されていない識別子のエラーが発生しています。
回答を見る
  • ベストアンサー

(MFC)別々のプロジェクト内で作成したダイアログを表示させる方法

VC++2005のMFCにてアプリケーションを作成しています。 一つのソリューション内に二つのプロジェクトA、Bが存在し、 プロジェクトAで発生したあるイベント(例:ボタン押下)にて、 プロジェクトBで作成したダイアログを表示させたいのですが、 実装したところ、下記コンパイルエラーが出てしまいます。 「error C2065: 'IDD_TEST2_DIALOG' : 定義されていない識別子です。」 現在のプロジェクトの設定としては、 ・プロジェクトAの依存先をプロジェクトBに設定 ・プロジェクトA選択状態で、  「プロジェクト」→「プロパティ」→「構成プロパティ」  →「C/C++全般」→「追加のインクルードディレクトリ」にて、プロジェクトBのパスを指定 と設定しているのですが、どこに問題があるのでしょうか? もし問題があるようでしたら、正しい設定方法、また実装方法について、 お手数おかけしますが、ご教授お願いできませんでしょうか? また下記にソースコード実装例を記載します。 【プロジェクトA(呼び出し側)】 #include "test2Dlg.h" //プロジェクトBのヘッダファイル ・・・ void Ctest1Dlg::OnBnClickedOk() { CDlgTest MyDlg; MyDlg.DoModal(); //プロジェクトBのダイアログ生成 } 【プロジェクトB(呼出され側)】 ・リソースビューにて、ダイアログ(IDD_TEST2_DIALOG)の「クラスの追加」で、  クラス名「CDlgTest」と指定

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

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

その構成には無理があると思います 別EXEのダイアログを表示したいってことですよね プロジェクトBの中のResource.h で定義された IDD_TEST2_DIALOGが プロジェクトAの中のどこかで定義されていない限り質問のようなエラーになるでしょう この問題が解決できたにせよ 今度はプロジェクトBのダイアログ用のリソースが プロジェクトAには 存在しません したがって CDlgTestのインスタンス MyDlgを初期化しようとした時点で実行時エラーになるでしょう リソースビューでプロジェクトBのダイアログを選択 編集 > コピー プロジェクトAを選択 編集 > 貼り付け でリソースをコピーします プロジェクトBの CDlgTestクラスのソース および ヘッダーをプロジェクト Aにコピー として 構築されることをお勧めします 別の方法としては プロジェクトBをDLLとして構築する方法がありますが ここですべてを説明できるものではありません

zigen8513
質問者

お礼

早急なご回答ありがとうございます。 Win32コンソールアプリケーションでの作成だと、 上手くいったのですが、MFCでは無理があるようですね。。 とりあえずはコピーを使用する方法で上手く動作したので、 DLL構築の方法については、余裕があれば独自で調べてみることにします。 ありがとうございました!

関連するQ&A

  • MFC VC++6.0 DestroyWindowの実装場所について

    [開発環境]:Visual C++ 6.0 現在、Visual C++ 6.0を使ったプログラミングの勉強をしています。 MFC AppWizard (exe)でSDIプログラムのtest1プロジェクト作成後、メインフレームにボタンを実装し、そのボタンを押下するとモードレスダイアログを表示するというアプリケーションを作っているのですが、ダイアログを終了させる時のDestroyWindowの実装場所と実装方法が分かりません。 ダイアログ用のクラスはCmyDialogとしていますが、ダイアログの終了ボタンを実装した場合、そのボタン処理の中すなわちCmyDialogクラスのなかの関数で行うべきなのでしょうか?それともダイアログの作成と同様にメインフレームがわの処理(CTest1Viewクラスでの処理?)として行うべきなのでしょうか?この場合にはどのような場所でどのようなタイミングで実装すればよいのか分かりません。 ご存じの方、これらについて御教授お願いします。 以下プログラムの一部を記載します。 -test1view.cppの一部-(ここでダイアログの作成と表示をしています) void CTest1View::OnButton1() { CmyDialog* myDLG = new CmyDialog; myDLG->Create(IDD_DIALOG1,this); myDLG->ShowWindow(SW_SHOW); }

  • MFC、ダイアログベースでのモードレス作成

    現在、MFCで検索プログラムを作成しています。 始めはDoModalで作成していたのですが、ダイアログを閉じずに、ダイアログを複数並べて見たいという意見が出た為、モードレスで作成し直そうとしたところ、ダイアログが現れてくれません。 インターネットで見つけたソースを試してみたのですが、上手くいきません。 どなたか教えて頂けますか? =ダイアログに移るボタンコードに= CDlg1 dlg; dlg.Create(IDD_DIALOG1, this); dlg.ShowWindow(SW_SHOW); (dlg.DestroyWindow();は他に記述) 1. 上記では、ShowWindowに0が返ってしまい、一瞬ダイアログが映って 消えてしまいます。Createは1が返ってるのでいいかと思いますが…。 2. あと、違うソースで試したところ、ダイアログは表示できるものの、 一回消してしまうと、もう一度ボタンを押しても再度は表示されません。 しかも、Destroy()を設定したOKボタンでは強制終了となってしまいます。 モードレスで作成すると、一回そのダイアログを消してしまうと再度表示ができないのでしょうか? モードレスってただ他の処理ができるというだけで、そのダイアログを何枚も表示させておくことはできないのでしょうか? 3. このダイアログにjpegファイルを表示させているのですが、ダイアログベース・htmlView以外で表示させれる方法がありましたら教えて下さい。 よろしくお願いします。

  • Microsoft Visual C++ 6.0でダイアログボックス作成後のEXE作成方法

    Microsoft Visual C++ 6.0を新規で開いて、「挿入」-「リソース」のリソースの挿入画面で、2つダイアログ(Dialog)を作りました。新規作成で作りましたので「Script1 – IDD_DIALOG1(Dialog)」「Script1 – IDD_DIALOG2(Dialog)」と2ウィンドウのタイトルバーに書かれてあります。さて、これらを保存しようとした時にプロジェクト名を決めないといけないみたいで、適当にtestと名づけました。プロジェクトを作成すると、「test.dsw」というプロジェクトワークスペースが出来ました。ここで、「Debug」というフォルダが作成されましたので、このフォルダ内にEXEファイルを作成して、EXEを実行して2つのウィンドウを上手く機能も付けてアプリケーションを作ろうと思っているのですが、コンパイルすると 『 プロジェクト 'test - Win32 Debug' 用の中間ファイルおよび出力ファイルを削除しています。 --------------------構成: test - Win32 Debug-------------------- リソースをコンパイル中... リンク中... LINK:error LNK2001:外部シンボル "_WinMainCRTStartup" は未解決です Debug/test.exe : fatal error LNK1120: 外部参照 1 が未解決です。 link.exe の実行エラー 』 と、ドッキングビューに表示されています。 どのようにしたら、EXEを作成できて実行できるか、対策案をお願いいたします。

  • 【MFC】sleep関数を用いたモーダルダイアログを閉じる処理の実装方法

    開発環境はVC++2005のMFCです。 Ctest dlg; dlg.DoModal(); にて呼出したダイアログを、sleep関数で一定の時間経過後に 自動で閉じる処理を実装したいのですが、どのように実装すれば良いでしょうか? またsleep関数でなく、他の時間を計る関数を用いたものでも良いので、 もしご存知の方おられましたら、ご教授お願い致します。

  • モードレスダイアログの作成方法

    以下のようにダイアログを作る場合、    dlg = new CMyDlg(this); ・・・1    dlg->Create(IDD_DIALOG1,this); ・・・2 それぞれのコードでthisを渡していますが、1で渡すthisと2で渡すthisは生成されるダイアログにどう影響をあたえるのですか? 両方とも親のウインドウを指示してると思うのですが、2回も指示するのはおかしいと思います。 また、1で何を与えようが、2でまた与えたら2が優先されて1で与えた意味が無い気がします。

  • ダイアログクラスへの値の受け渡し

    VC++6.0 ダイアログベースです。 下記のように、親ダイアログクラスから、ボタンコントロールで2つの子ダイアログクラスを呼び出して いるのですが、自作で作った処理用のクラスを子ダイアログ2から呼び出す場合に 上手く値を渡すことが出来ません。 子ダイアログ2に設定値を送り、その送られてきた設定値を使って自作クラスに値を送ろうと考えてみたのですが、 Dialog2->DoModal(); でエラーとなります。 どの用にしたら、子ダイアログ2から自作関数を呼び出した時も、ダイアログ1で設定された値を使うことができるでしょうか? よろしくお願いします。 /**親ダイアログクラス***********************************************************:*/   //■ボタン1が押されたら子ダイアログ1を開く  CDialog1 *Dialog1;    Dialog1 = new CDialog1();    Dialog1->DoModal();//子ダイアログクラス1呼び出し     //■ボタン2が押されたら子ダイアログ2を開く    CDialog2 *Dialog2;    if (Dialog1->flag == 1){      Dialog2 = new CDialog2(Dialog1->m_hoge1,Dialog1->m_hoge2,Dialog1->m_hoge3);  else{       Dialog2 = new CDialog2(0,0,0);//設定値が読み込まれていなかったら初期値を送る  }      Dialog2->DoModal();//子ダイアログクラス2呼び出し   //■ボタン3が押されたら自作クラスを呼び出します。    //自作クラスを呼び出します。  CJisaku *jisaku;    jisaku = new CJisaku();    //自作クラスの関数呼び出し    jisaku->ppfm(Dialog1->m_hoge1,Dialog1->m_hoge2,Dialog1->m_hoge3,);     /**子ダイアログクラス1**********************************************************/   //自作クラスで扱う設定値を決めます   public:    int m_hoge1;//呼び出されたらint型の変数m_hoge1に値を入れる。   int m_hoge2;//呼び出されたらint型の変数m_hoge2に値を入れる。   int m_hoge3;//呼び出されたらint型の変数m_hoge3に値を入れる。   Cstring m_hogestring;//呼び出されたらCstring型の変数m_hogestringに値を入れる。 BOOL m_flag;   //初期値 flag = false;   //一度でも呼び出されたら flag = true; /**子ダイアログクラス2********************************************************/   //自作クラスを呼び出します。   //コンストラクタ Dialog2::Dialog2(int a,int b, int c){    m_a = a;    m_b = b;    m_c = c; }   jisaku = new CJisaku();   jisaku->ppfm(m_a,m_b,m_c);//自作クラスの関数呼び出し /**自作クラス*******************************************************************/   void ppfm(int a,int b, int c)   {   //ここで子ダイアログクラス1で設定した値を使いたい。   }

  • ダイアログを表示しないexeを作成しようとしてるのですが、どのプロジェクトでしたらよいのでしょうか?

    お世話になります。 VisaulStdio2003 C++ で開発しております。 インストールシールドのある箇所からA.exe(C++で作成)を起動しようとしているのですが、そのA.exeはファイルなどを削除する処理で、ダイアログとかは、何も表示しないようにしたいのです。 そのような場合は、A.exeはどのプロジェクトで作成すればよいのでしょうか? ※私の知識では、MFCのダイアログベースで作成し、ダイアログを非表示にするくらいしか思いつかなかったのです。。。 お手数ですがよろしくお願いします。

  • ダイアログベースアプリのDLL化の方法について

    ダイアログベースで作成してあるアプリexeを DLL化するのですが、その方法が分かりません。 ダイアログの使用はやめるつもりです。 これまでやってみたことは、 プロジェクトのプロパティで、EXEファイルからDLLに設定を 変更しました。 http://hp.vector.co.jp/authors/VA019517/howtodll.html サンプルを見て、既存のソースに__stdcallなどを記載したいのですが DLLが作成されませんでした。 新規にプロジェクトを作成して、サンプル通りにやった場合は DLLが作成されました。 呼び出したい関数は、別々のファイルですが、 1つのファイルにまとめる必要がありますか? ダイアログベースはやめます。 この2つの関数は、同じDLLにします。 ↓DLL化するソース。ここを外部EXEから呼び出したい。 Test_aa_App.cpp --------------------------------------- CTest_aa_App::InitInctance(){ //初期化処理 } ↓呼び出し対象DLL Test_bb_Dlg.cpp -------------------------------- CTest_bb_Dlg::Test() { // 処理 } 初歩的なことだと思いますが、まず、どのように ソースを変更すれば良いか教えてください。 VS2003 C++6.0 よろしくお願いします。

  • OnDestroy() について

    環境 WIN98 VC++6.0 MFC SDIにて アプリ起動と同時にダイアログを表示しています。 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { 略 dlg = new CInput(this); dlg->Create(IDD_DIALOG1); dlg->ShowWindow(SW_SHOW); return 0; } <質問1> このような場合に、CInputクラスに以下のようにOnDestroy()を追加しましたが、 ダイアログを閉じた時もアプリ終了時にもメッセージが飛んできません。 どうしてなのですか? void CInput::OnDestroy() { CDialog::OnDestroy(); AfxMessageBox("789"); } <質問2> 更に、以下のように新規にダイアログバーを追加したところ、メッセージが飛ぶようになりました。 どうしてなのでしょうか? int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { 略 if (!m_wndMyDialogBar.Create(this, CG_IDD_MYDIALOGBAR, WS_VISIBLE , CG_ID_VIEW_MYDIALOGBAR)) { TRACE0("Failed to create dialog bar m_wndMyDialogBar\n"); return -1; // 作成に失敗 } dlg = new CInput(this); dlg->Create(IDD_DIALOG1); dlg->ShowWindow(SW_SHOW); return 0; }

  • Webアプリで異なるプロジェクトの参照

    Eclipse上で異なる動的WebプロジェクトをA と B を作成しているのですが AのプロジェクトからBのプロジェクトのクラスを参照させたいと思っています。 そこでAプロジェクト上で右クリック→プロパティ にて Deployment Assembly を選択し、 追加でBプロジェクトを選択しました。これにより Aプロジェクトのソースで Bプロジェクトのクラスをコールしている部分のコンパイルが通りました。 しかし、この状態でサーバーを起動し、テストしてみるとBプロジェクトのクラスをコールしているところ でClass Not Found Exception が発生してしまいます。 まだ何か設定をする必要があるのでしょうか。 Aプロジェクト上で右クリックで Javaのビルドパス の設定画面でBプロジェクトにパスを 通しても同様のエラーが発生いたしました。 どなたか対応策はお分かりになりますでしょうか。 ちなみに、Bプロジェクトをjarにして出力してAプロジェクトのlibにインポートした場合はうまくいきました。

    • ベストアンサー
    • Java

専門家に質問してみよう