• ベストアンサー

別のDLLのダイアログを・・・

VC++.NETでMFCアプリを開発しています。 コマンド側から、別のDLLのダイアログをCreateし、ShowWindow()したところで例外が発生します。 コマンド側は通常のDLLで作成し、「staticライブラリでMFCを使用する」で使用し、 ダイアログ側は拡張DLLで作成し、「共有DLLでMFCを使用する」で使用しております。 Create()するところで、コマンドのポインタをダイアログに渡すと例外が発生します。 理由がわかりません。教えてくださいm(__)m 説明が足りなければ補足いたします。

  • kewa
  • お礼率18% (7/37)

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

一番手っ取り早いのは、AfxSetResourceHandle()でダイアログリソースの読みこみ対象をDLLに置き換える。

kewa
質問者

補足

AfxSetResourceHandle()を使用して DLLに置き換えてみましたが、うまく行きません。 //元のインスタンスを取得 m_hBaseInstance = AfxGetResourceHandle(); //MFCの動的接続 AFX_MANAGE_STATE(AfxGetStaticModuleState()); //MFCのインスタンスハンドルを取得 m_hMFCInstance = AfxGetResourceHandle(); とやっているんですが、元のハンドルと新しいハンドルの値が同じになります。 何か他に設定が必要なんでしょうか???

その他の回答 (1)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>コマンド側から、別のDLLのダイアログをCreateし、ShowWindow()したところで例外が発生します。 てっきり「別のDLLのダイアログをCreate」って書いてあったんで、「別のDLLがリソースを持つダイアログを」 って解釈で回答しちゃったんですが。 これって、実際にダイアログのCreateメソッドを呼んでいるのはどこですか?呼び元のDLL?呼び先? >Create()するところで、コマンドのポインタをダイアログに渡すと例外が発生します。 ポインタってなんのポインタですか? ポインタを渡すと例外って、渡さないと例外が発生しないんですか? 渡すと、渡すだけで例外が発生していますか? 何かの処理をして例外が発生するんですか? 例外が発生する場所は特定できてますか? あと、呼び元のEXE、それぞれのDLLのビルドタイプはDebugビルド、またはReleaseビルドのどちらかに 統一されていますか?

関連するQ&A

  • VC++.NET DLLからのダイアログの表示

    こんばんは。 VC++.NETでDLLを作成しました。 内容はダイアログを表示させるだけの単純なもので DLLの種類はMFC拡張DLLで作成しました。 (CDIALOGを継承したクラスTESTDIALOGのコンストラクタ、デストラクタがあるだけのもの) これをテスト用の単純なMFCアプリケーションで呼び出したところ ダイアログを表示させることができましたが 別の複雑なアプリケーション(DLLからDLLを呼ぶなどしている)で 呼び出したところダイアログが表示されません。 コンパイルエラーなどもでないし 何がいけないのか分かりません。 呼び出し側ではメニューにイベントハンドラを作ってそこで TESTDIALOG dlg; dlg.DoModal(); としているだけなのですが・・・ (デバッガで追ったところMFCのdlgcore.cppのCDialog::DoModalの m_lpDialogTemplateNameが不適切なptrとなる辺りに原因はありそうなのですが何故そうなるのかわかりません。) どなたかダイアログが表示されない原因がお分かりになる方 よろしくお願いします。

  • DLLでダイアログ

    VC++6.0にてMFCを使うDLLを作成しています。 関連HPを参考になんとかDLLを作ることが出来ました。 そこで今度はDLL側でダイアログボックスを作成して表示させようとしたところうまくいきません。 エラーも無くスルーされてしまいます。 こういう使い方は出来ないのでしょうか。 ↓DLL関数のソースファイルです。 ---------------------------------------------- #include "StdAfx.h" #include "Defs.h" #include "Func.h" #include "resource.h" #include "testdlg.h" #include "dlg2.h" int WINAPI DllFunc( CString &p_rcStr, CWnd *p_pcWnd ) { TestDlg dlg; Cdlg2 dlg2; dlg.ps = p_rcStr; dlg2.DoModal();//なにも出ない AfxMessageBox(p_rcStr);//コレはOK dlg.DoModal();//何もでない return TRUE; } --------------------------------------------

  • DLLについて

    VC++でDLLを作成しようとしているのですがいくつか判らない点があります。 1. スタティックライブラリとスタティックリンクライブラリの違い。この二つの用語の違いが分かりません。 2.VBからVC++で作成したDLLを使用するときには.libファイルは必要ないのでしょうか。使用しなくても、使うことができたので。

  • ダイアログをアクティブにするには?

    よろしくお願い致します。 環境 WIN98 VC++6.0 MFC にて ダイアログを非表示から dlg->ShowWindow(SW_SHOW);にて 表示にしましたが、アクティブ状態になっていません。 アクティブにするにはどうすれば良いですか?

  • ダイアログのクライアントの境界線

    現在、VC++でダイアログベースのプログラムを作成中で質問があるのですが。(MFCは使っていません。) ダイアログエディタで指定する「クライアントの境界線」はダイアログエディタを使用しないと指定できないのでしょうか? また、ダイアログの中にビットマップを組み込むことはできるのでしょうか? ちなみにダイアログはCreateWindow()をPOPUP指定し、それをShowWindow()で出力する単純なものです。 色々いっぺんに質問して申し訳ありませんが、よろしくお願いします。

  • CWndを使うDLL

    質問1 CWndのサブクラスを作りたいDLLは、以下のどのDLLとして作成すれば良いでしょうか? ・Win32 DLL ・MFC共有DLL ・MFC拡張DLL ちなみに、このDLLは、必ずしもMFCで作成されたアプリケーションでロードされるとは限りません。 質問2 上記選択でMFCになった場合、MFCのライブラリは動的リンクと静的リンクのどちらになるのでしょうか? 自分で選択できるのであれば、その方法を教えてください。 質問3 上記選択で静的リンクになった場合。 MSDNのページで調べると以下のような制限があるとのことですが、具体的には、こういうことでしょうか? ・DLL内で確保したメモリのポインタを上位からもらってもいけないし、上位へ返してもいけない。 ・MFC オブジェクト(CWndサブクラスへのポインタなど)を上位からもらってもいけないし、返してもいけない。 --- MSDN引用ここから 「レギュラー DLL 内のメモリ割り当てはすべて、DLL の範囲内に収める必要があります。 したがって、以下のポインタを呼び出し側の実行可能ファイルとやり取りすることはできません。 ・MFC オブジェクトへのポインタ ・MFC によって割り当てられたメモリへのポインタ --- MSDN引用ここまで よろしくお願いします。

  • DLLからサードパーティDLLを使うには

    現在VisualC++2010においてレギュラーDLLを作成しています。そのDLL内でサードパーティライブラリを使いたいのですが、MFCプロジェクトなどと同様にインポートライブラリ設定やDLLの配置を行なってもうまくいきません。具体的には、作成したレギュラーDLLをインポートしたプログラム実行時にdllinit.cpp内でDebug Assertionが出ます。 VC++においてDLL内からDLLを使用するのは一工夫いるということまではわかっているのですが、なにかよい解決策をご存知の方がおられましたらご教授願えれば幸いです。

  • 子ダイアログのデータを親ダイアログで取得するには

    VC6.0にてMFCでダイアログベースアプリケーションを作成しています。 親ダイアログ(TestDlg.cpp)のメニューを選択すると、子ダイアログ(SetDlg.cpp)が開き、テキストボックスに文字を入力し、ボタン押下によりテキストボックスの入力数字を確定(グローバル変数(igStatu)に代入)しています。 子ウインドウで入力確定したデータを、親ダイアログにて使用したいのですが、データが受け渡されずに、親ダイアログ側にデータが入りません。 どのようにしたら、子ダイアログで設定したデータを親ダイアログで取得することができるのでしょうか? C++、MFCともに全然わかっていませんがお願いします。 グローバル変数は、TestDlg.cpp、SetDlg.cppがインクルードしているTest.h内にstatic宣言しています。 static宣言しないとリンクエラー2005になってしまいます。

  • スレッド処理からダイアログを表示するには?

    Windows XPとVC++ 6.0で 時間のかかる大量の計算をするプログラムを作っています。 計算部分はスレッド処理にして 進捗ダイアログ(CDialogにCProgressCtrlを貼り付けたもの) を表示します。 ・CWinAppのInitInstanceで計算処理開始(AfxBeginThread) ・計算処理内で進捗ダイアログをCreate ・計算の進み具合によって進捗ダイアログのプログレスバーを更新 上記の流れではうまくいっていたのですが 以下のように変更したところ、進捗ダイアログをCreateするところで プログラムが応答なしになってしまうようになりました。 ・メインダイアログ(モーダル) ・メインダイアログのAボタンクリックでダイアログAを開く(モーダル) ・ダイアログAの実行ボタンクリックで計算処理開始(AfxBeginThread) ・計算処理内で進捗ダイアログをCreate ・計算の進み具合によって進捗ダイアログのプログレスバーを更新 MFC Wizardでダイアログベースで作成、MFCの共有DLLを使用しています。 モーダルダイアログ→スレッド→CDialog.Createに 制限があったりするのでしょうか。 どうかご教授ください。

  • 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以外で表示させれる方法がありましたら教えて下さい。 よろしくお願いします。