
現在、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を探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SwingでJtableのヘッダ行が表示...
-
JAVAでCの関数ポインタのような...
-
メインが含まれていません
-
JAVA エラー 式の開始が不正で...
-
「配列定数は、イニシャライザ...
-
intが負の時に投げる例外はあり...
-
式の型は配列型で int に解決済...
-
Java 初心者 int型の取り扱い方
-
共有メモリについて
-
c# デリゲート関連の命名について
-
System.err. printlnとSystem.o...
-
動的配列が存在(要素が有る)か...
-
javaで質問です。 文字列2023/2...
-
C言語のポインターに関する警告
-
ループ処理の際、最後だけ","を...
-
オブジェクトの中のプロパティ...
-
JSPでImportエラーになります
-
[JAVA]try 内の変数を外で!?
-
[Ljava.lang.Stringってなんですか
-
IF関数でEmpty値を設定する方法。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「配列定数は、イニシャライザ...
-
メインが含まれていません
-
式の型は配列型で int に解決済...
-
javaでカレンダー作成
-
DataSet(DataTable)の使い方
-
Java 初心者 int型の取り扱い方
-
java初心者の質問(3つの整数の...
-
javaでcsvファイル読込時の改行...
-
Java 日付の加算がうまくいき...
-
JAVA エラー 式の開始が不正で...
-
6桁の数字を重複なしでランダム...
-
コンパイルできません
-
SwingでJtableのヘッダ行が表示...
-
C#で実行時にメソッドの返り値...
-
intが負の時に投げる例外はあり...
-
意味がわかりません
-
コンパイラが注意してくる
-
複数のボタンを配置し、それぞ...
-
Threadに関するの質問
-
C#でバブルソート
おすすめ情報