- PR -

VC++.NET 2005でCLRからMFCを呼び出す

投稿者投稿内容
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2006-12-19 17:12
こんにちは。

これから開発しようとしているアプリケーションで、一部の機能がMFCを介して
呼び出すようなつくりのライブラリがあります。

すべてMFCで開発すればすむのですが、画面系が凝ったつくりで、非効率なMFCでつく
るにはかなり大変な物ですので、.NET Frameworkを利用して画面設計したいのです。

そこで、基本はVC++2005のCLRで、一部はMFCを呼び出すような開発方法を検討中です。

ためしに、以下を参考にマネージド/アンマネージドの混在アプリを作って呼び出して
みたのでうが、実行時にエラーが出ます。
http://msdn2.microsoft.com/ja-jp/library/ms235211(VS.80).aspx

具体的には、CLRアプリのプロジェクトに上記のとおりプロジェクトのプロパティを
変更して、ダイアログのリソースを追加して、そのダイアログをクラスとして追加
して、そのクラスに #include "resource.h" を追加して、コンパイルします。
コンパイルは通ります。

それを実行すると、

Debug Assertion Dailed!
Program: ...
File: dbgheap.c
Line:1414

というエラーダイアログが出ます。

CLRとMFC混在のプログラムを作った実績のあるかたおられませんでしょうか?
また、このエラーを退治するにはどうすればいいのでしょうか?
よろしくお願いします。

[ メッセージ編集済み 編集者: maru 編集日時 2006-12-19 17:13 ]

[ メッセージ編集済み 編集者: maru 編集日時 2006-12-19 17:15 ]
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2006-12-19 17:20
以前質問しました。参考にどうぞ。

CLRプロジェクトにてMFCを使用する方法
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2006-12-19 18:08
こんにちは。
ありがとうございます。
とりあえず手順通りすると起動時にはエラーは出なくなりました。
ただ、以下のコードをボタンクリックに追加して実行してみたところ、
dlgcode.cpp で同じようなエラーが出ます。

そもそも、このエラーはどういう理由から出るものなのでしょうか?
CLRのメモリ管理?

コード:
private: System::Void button1_Click(System:bject^  sender, System::EventArgs^  e) {
    CDialog1 dlg;
    dlg.Create(IDD_DIALOG1,NULL);
    dlg.DoModal();
}


Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2006-12-19 20:05
というかそのコードCLRでなくてもキチンと動きますか?
引用:
コード:

CDialog1 dlg;
dlg.Create(IDD_DIALOG1,NULL);
dlg.DoModal();



とってもありえないコードだとおもうのですが。。。


[ メッセージ編集済み 編集者: Blue 編集日時 2006-12-19 20:06 ]
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2006-12-20 10:10
こんにちは。
返答ありがとうございます。
お騒がせしました。MFCでモーダル表示の場合、Createは不要のようですね。
問題なく動きました。

Java/c/c++/VB.NET/C#はそれなりの経験はあるのですが、MFCにいたっては今まで
仕事に関係なかったので避けてたとこがあり、いまいち使い方がよく分かってません
でした。

なんで、モードレスではCreateしてモーダルではCreateが必要ないかなど、仕組みが
わかってなく、そんなもので終わらせてもいいのですが、いまいちすっきりしません。
また、調べてみようと思います。

ありがとうございました。
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2006-12-20 17:00
こんにちは。

CLRフォームからMFCフォームを開くことはできました。
今度はActiveXコントロールで行き詰ってます。
具体的にはCLRフォームにActiveXコントロールを貼り付けてみると問題なく動きます。
CLRフォームから呼び出されるMFCフォームにActiveXコントロールを貼り付けてDoModal
してもうんともすんとも動きません。普通、DoModalでモーダルフォーム側に処理が
移ると思うのですが、なんかするりと処理が抜けてしまいます。

何が原因か分かる方いませんでしょうか?

PS.
C++/CLIってなんかすごい!って思うのは私だけ?

Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2006-12-20 17:15
新しくスレを建てたほうがよいかも。

そのダイアログはMFCのプロジェクトではきちんと表示できますか?
CoInitializeとかが必要なのかも。(<-適当)
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2006-12-20 17:41
こんにちは。

MFCプロジェクトでは、ActiveXを貼り付けただけのフォームですが、特に初期化など
のコードを書くことなく問題なく表示されます。

同じことをCLRで呼び出すと、何事もなくするりとDoModalが終わってしまいます。

ちなみに、MFCがよく分かってないため、CLRの問題かMFCの問題かの切り分けがまだ
よくできない状態です。

スキルアップ/キャリアアップ(JOB@IT)