
現在、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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# PC画面を録画するプログラムでdllの読み込みエラー 1 2023/04/22 08:31
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メインが含まれていません
-
前日日付の取得
-
C#経過時間の求め方
-
java 継承
-
classを使って座標軸を求めるコ...
-
Stringの文字列をString[]配列...
-
数学的な処理
-
JAVAでCの関数ポインタのような...
-
classの中の配列の初期化
-
「配列定数は、イニシャライザ...
-
実行時型情報を、newの引数にす...
-
Java 初心者 int型の取り扱い方
-
10列10行の文字列表示について
-
共有メモリについて
-
C++からC#のdllを参照する際、...
-
成績表示プログラム
-
javaのエラーの意味がわかりま...
-
DataSet(DataTable)の使い方
-
java初心者の質問(3つの整数の...
-
SwingでJtableのヘッダ行が表示...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c# デリゲート関連の命名について
-
「配列定数は、イニシャライザ...
-
SwingでJtableのヘッダ行が表示...
-
java spring でエラーが出て困...
-
Comparatorを使用したソートに...
-
【C#】フォームをなめらかに移動
-
アンマネージDLLで、ダイアログ...
-
JUnit4のアノテーションについて
-
式の型は配列型で int に解決済...
-
java 長さの異なる配列の代入
-
DataSet(DataTable)の使い方
-
JAVA エラー 式の開始が不正で...
-
JAVAでCの関数ポインタのような...
-
メインが含まれていません
-
javaでcsvファイル読込時の改行...
-
tabにdrawImageで画像を描画したい
-
ウィンドウの整列
-
C#でバブルソート
-
行の途中から読み込む方法
-
ある年月の月間日数を取得する...
おすすめ情報