
現在、Visual Studio 2005の、Visual C#、C++/CLI、MFCを使ったシステムを構築しています。
具体的には、MFCで書かれた(拡張DLL)でダイアログを表示。これをC++/CLIでラップし、C#から呼び出して使いたいと思っております。
そこで、http://soudan1.biglobe.ne.jp/qa3834982.htmlを参考にして、以下のように作ったのですが、DLL内のdlg.DoModal()のコールで、
AfxGetResourceHandle()でASSERTが発生してしまいます。
//// C#のフォーム
using LogGphWrap;
namespace DllTestApp {
public partial class Form1 : Form {
private void button1_Click(object sender, EventArgs e) {
Wrapdll.Wrapper.DlgOpen(this.Handle.ToInt32());
}
}
}
//// Wrapdll(CRLのクラスライブラリ) [Wrapdll.h]
[DllImport("MFCdll.dll")]
bool dspDlg(int hDib);
namespace Wrapdll {
public ref class Wrapper
{
public:
static bool DlgOpen(int hDib) {
return ( dspDlg(hDib) ) ;
}
};
}
//// MFCdll(MFCの拡張DLL) [MFCdll.h]
#include "resource.h"
bool dspDlg(HWND hDib);
//// MFCdll(MFCの拡張DLL) [MFCdll.cpp]
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
:
デフォルトのまま
:
}
bool dspDlg (HWND hDib) {
AFX_MANAGE_STATE(AfxGetAppModuleState());
AfxMessageBox(_T("ちょっとお試し"), 0, 0) ;
CTestDlg *dlg = new CTestDlg(CWnd::FromHandle(hDib));
dlg->Create(IDD_DIALOG) ; <====この部分でASSERTが発生!!
return TRUE ;
}
ご存知の方がいらっしゃれば、ご教授ください。
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
こんにちは。
異なる言語を使ったプログラムは組んだことないのですが、多分同じではないかと思ってレスさせてください。
質問で書かれているプログラムでは、恐らくDLL側にリソースエディタでダイアログを作成されたと思いますが、DLL側から参照使用としているリソースはそのままではアプリケーション側(呼出元)のリソースを参照としているためにASSERTが発生します。DLL側にセットされたリソースを読もうとはしていません。
これを回避するためにはDLLのインスタンスハンドルを取得して直接読むようにするのが良いと思います。
HMODULE hModule ;
HRSRC hResource ;
hModule = ::GetModuleHandle( モジュール名 ) ;
hResource = ::FindResource( hModule, MAKEINTRESOURCE( リソースID ), RT_DIALOG ) ;
m_hResGlobal = ::LoadResource( hModule, hResource ) ;
m_hResGlobalをクラスのメンバーとして保持しておき、
CTestDlg::Create( CWnd* const lpwndParent )
{
CDialog::CreateIndirect( m_hResGlobal, lpwndParent ) ;
}
とすればちゃんと表示されると思います。
各関数についてはヘルプを見てください。
takupyさん、レス有難うございました。
ご指摘のように、インスタンスハンドルを取得したのですが、
やはり、ASSERTが発生してしまいます。
デバックでチェックする限りでは、モジュールもリソースも
取得できているようなのですが・・・
HMODULE hModule ;
HRSRC hResource ;
hModule = ::GetModuleHandle( _T("MFCdll") ) ;
hResource = ::FindResource( hModule, MAKEINTRESOURCE(IDD_DIALOG), RT_DIALOG ) ;
m_hResGlobal = ::LoadResource( hModule, hResource ) ;
CTestDlg::Create( CWnd* const lpwndParent )
{
CDialog::CreateIndirect( m_hResGlobal, lpwndParent ) ;<=====この要求時のAfxGetResourceHandle()でASSERTが発生・・・
}
No.2
- 回答日時:
マネージドから呼び出した場合にMFC周りの初期化がうまくいっていないのが原因のようですよ
VC++で Win32APPやMFCEXEで お作りになったMFCDLL.DLLのdispDlgを呼ぶようなアプリを作ってみてはいかがでしょう
多分アサートはされないはずです
このとき dlg->Createから呼ばれたCDialog::Createで呼ばれる
_AfxCheckDialogTemplate関数でAfxFindResourceHandleを呼び出します
この中でAfxGetModuleStateで取得した pModuleStateメンバーの値と
マネージから呼ばれた場合とで比較してみましょう
マネージから呼ばれた場合 m_hCurrentResourceHandleなどのメンバーがNULLになっているようです
redfox63さん、有難うございます。
いろいろと試してみたのですが、結局、
マネージDLLで作り直す方向で考えています。
ご指導有難うございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
(Swing)JTextFieldを半角のみ入...
-
C++からC#のdllを参照する際、...
-
C#で実行時にメソッドの返り値...
-
メインが含まれていません
-
C#でバブルソート
-
式の型は配列型で int に解決済...
-
JAVAでCの関数ポインタのような...
-
JAVA エラー 式の開始が不正で...
-
複数線を引くには?
-
javaでcsvファイル読込時の改行...
-
System.err. printlnとSystem.o...
-
EXCEL VBA で、0から?1から?
-
JSPやサーブレットでSystem.out...
-
JSPでImportエラーになります
-
ループ処理の際、最後だけ","を...
-
パソコンキーボードで時分秒を...
-
オブジェクトの中のプロパティ...
-
javaで文字数制限するには?
-
BOOL値を逆にしたい
-
IF関数でEmpty値を設定する方法。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「配列定数は、イニシャライザ...
-
メインが含まれていません
-
式の型は配列型で int に解決済...
-
javaでカレンダー作成
-
DataSet(DataTable)の使い方
-
Java 初心者 int型の取り扱い方
-
java初心者の質問(3つの整数の...
-
javaでcsvファイル読込時の改行...
-
Java 日付の加算がうまくいき...
-
JAVA エラー 式の開始が不正で...
-
6桁の数字を重複なしでランダム...
-
コンパイルできません
-
SwingでJtableのヘッダ行が表示...
-
C#で実行時にメソッドの返り値...
-
intが負の時に投げる例外はあり...
-
意味がわかりません
-
コンパイラが注意してくる
-
複数のボタンを配置し、それぞ...
-
Threadに関するの質問
-
C#でバブルソート
おすすめ情報