C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: C#→C++/CLI→C++(MFC)の呼び出しについて


(過去ログ 61 を表示中)

[トピック内 20 記事 (1 - 20 表示)]  << 0 >>

■34991 / inTopicNo.1)  C#→C++/CLI→C++(MFC)の呼び出しについて
  
□投稿者/ noridon (1回)-(2009/04/16(Thu) 11:09:11)

分類:[C++/CLI] 

はじめまして。
今、アプリケーションをC#で開発しようと思っているのですが、C++(MFC)の資産をなるべく使いたいと思っています。
そこで、C#からC++/CLIを経由して、非マネージのC++のコードを呼び出したいのですが、自作の関数等は問題なく
呼び出せたのですが、CWndをC#のウィンドウに貼ろうと思い、C++/CLIでCWnd::Create()を呼んでやると、
MFC内でアサートが出てしまいます。そこまではデバッガで追えません。

C#では、親ウィンドウのハンドルを以下の様にして取得しています
System.IntPtr hWnd = System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle;

これをC++/CLIで、以下の様にして、親のCWnd*を求めています。
HWND hParent = (HWND)hWnd.ToPointer();
CWnd* pParent = CWnd::FromHandle(hParent);

そして、C++/CLIでnewで作ったCWndに対して、Create()を呼んでいます。
CRect crPrev.SetRect(0, 0, 320, 320);
m_pWnd->Create(NULL, (LPCTSTR)"Preview", WS_CHILD | WS_VISIBLE, crPrev, pParent, 0);

しかし、このCreate内でアサートが表示され、コードを追えません。

MFCのCWndなどをC#から使いたい場合は、どうしたら良いでしょうか?
お知恵を拝借できれば助かります。
よろしくお願いします。
引用返信 編集キー/
■34992 / inTopicNo.2)  Re[1]: C#→C++/CLI→C++(MFC)の呼び出しについて
□投稿者/ Blue (7回)-(2009/04/16(Thu) 11:19:04)
とりあえず
>(LPCTSTR)"Preview"
は間違っている。

LPCTSTR = const wchar_t* (farはとりあえず無視)
であるとき、どのようになるか理解できますか?

TEXTマクロか_Tマクロを使うように変更してください。

_T("Preview")
引用返信 編集キー/
■34993 / inTopicNo.3)  Re[2]: C#→C++/CLI→C++(MFC)の呼び出しについて
□投稿者/ noridon (2回)-(2009/04/16(Thu) 11:29:15)
恐れ入ります。
LPCTSTR が const wchar_t* だと困りますね。
普段あまり、unicodeとか意識していないもので。

> TEXTマクロか_Tマクロを使うように変更してください。
>
> _T("Preview")

早速、変更してみましたが、状態は同じでした。
クラスをCWndから派生させて、Create()をオーバライドして、非マネージコードでCWnd::Create()を呼ぶようにしても
変わりませんでした。
それと、そこにブレークポイントを置いても、実行時に無効になってしまいます。
この様に混合したプロジェクトでは、C++のコードはデバッガでは追えないのでしょうか?

すみませんが、よろしくお願いします。

引用返信 編集キー/
■34994 / inTopicNo.4)  Re[3]: C#→C++/CLI→C++(MFC)の呼び出しについて
□投稿者/ επιστημη (1889回)-(2009/04/16(Thu) 11:54:26)
επιστημη さんの Web サイト
2009/04/16(Thu) 11:57:49 編集(投稿者)

水を注す言い様を許してもらえるなら、
CWnd絡みをMFCから流用するのは大局的には得策でないように思えます。

MFCで構築された"見てくれ"を基にC#(Form-designer)で起こしておけば、
変更/拡張らっくらくになるでしょうね。MFCを温存/流用したらどうなります?
メンテを継続するだけのスキルとリソースを維持できるのでしょうか。
# 現状WindowのCreateすらおぼつかないんでしょ?

C/C++で書かれたビジネスロジックをC++/CLIでwrapして、というのはわかるんですけども。

引用返信 編集キー/
■34995 / inTopicNo.5)  Re[1]: C#→C++/CLI→C++(MFC)の呼び出しについて
□投稿者/ 渋木宏明(ひどり) (1116回)-(2009/04/16(Thu) 12:04:45)
渋木宏明(ひどり) さんの Web サイト
2009/04/16(Thu) 12:05:02 編集(投稿者)

> MFC内でアサートが出てしまいます。

アサートが出た箇所のソースをデバッガで確認しましょう。
そこに大抵、ヒントになるコメントが書かれています。

>そこまではデバッガで追えません。

追えます。
C# プロジェクトのプロパティの「デバッグ」ページに「ネイティブコードのデバッグを有効にする」的なチェックがあるので、それをONにしてデバッグ実行してください。

引用返信 編集キー/
■34996 / inTopicNo.6)  Re[4]: C#→C++/CLI→C++(MFC)の呼び出しについて
□投稿者/ noridon (4回)-(2009/04/16(Thu) 12:12:57)
ご意見有難うございます。

実は今回、ビデオ編集アプリをC#メインで作ろうと思っています。
そこで、DirectShowが使いたいのですが、権利の問題からDirectShow.Netは使えません。
となると、自分で同程度の機能を持ったラッパーを作るか、それとも表示部だけは今までどおりC++(MFC)で
コーディングしてしまい、その表示関係のクラスをC#から呼び出せないかと考えているのです。
そして、社員全員にMFCの経験が豊富にある点を鑑みて、後者の方法が良いかと思いました。
そうすれば、動画を表示する部分は、MFCで今までどおり作りで誰でも作れますし、C#の本体とは
別々にコーディング&テストが出来るだろうと期待しています。
今後、社内の方向性としてC#メインにして行くかどうかはまだ判りませんので、
今回は両方を使うカタチで実現出来ればと考えました。

> 水を注す言い様を許してもらえるなら、
> CWnd絡みをMFCから流用するのは大局的には得策でないように思えます。
>
> MFCで構築された"見てくれ"を基にC#(Form-designer)で起こしておけば、
> 変更/拡張らっくらくになるでしょうね。MFCを温存/流用したらどうなります?
> メンテを継続するだけのスキルとリソースを維持できるのでしょうか。
> # 現状WindowのCreateすらおぼつかないんでしょ?
>
> C/C++で書かれたビジネスロジックをC++/CLIでwrapして、というのはわかるんですけども。
引用返信 編集キー/
■34997 / inTopicNo.7)  Re[2]: C#→C++/CLI→C++(MFC)の呼び出しについて
□投稿者/ noridon (5回)-(2009/04/16(Thu) 12:22:12)
> >そこまではデバッガで追えません。
>
> 追えます。
> C# プロジェクトのプロパティの「デバッグ」ページに「ネイティブコードのデバッグを有効にする」的なチェックがあるので、それをONにしてデバッグ実行してください。
>

デバッガで追えました。
有難うございます。

>>MFC内でアサートが出てしまいます。
>
> アサートが出た箇所のソースをデバッガで確認しましょう。
> そこに大抵、ヒントになるコメントが書かれています。

どうやら、AfxGetInstanceHandle()がNULLを返しているようです。

これはMFC側の初期化とかうまく行ってないとかですかねぇ...。

引用返信 編集キー/
■34999 / inTopicNo.8)  Re[3]: C#→C++/CLI→C++(MFC)の呼び出
□投稿者/ Azulean (356回)-(2009/04/16(Thu) 12:45:28)
2009/04/16(Thu) 12:47:11 編集(投稿者)

No34997 (noridon さん) に返信
> これはMFC側の初期化とかうまく行ってないとかですかねぇ...。
そうですね、この手のパターンだと初期化処理が入っていないパターンですね。
C++/CLIだと確か、MFCのために自分で色々と書く必要があります。
引用返信 編集キー/
■35000 / inTopicNo.9)  Re[4]: C#→C++/CLI→C++(MFC)の呼び出しについて
□投稿者/ noridon (6回)-(2009/04/16(Thu) 12:48:59)
返信有難うございます。

> C++/CLIだとMFCの初期化を自分で書く必要があります。

そうなんですか!?
具体的に教えて頂ければ助かりますが、
もし解説されている参考ページなどがあれば、お教え頂ければ幸いです。
色々調べて試行錯誤しているのですが、中々解決出来ません。
よろしくお願いします。
引用返信 編集キー/
■35001 / inTopicNo.10)  Re[5]: C#→C++/CLI→C++(MFC)の呼び出しについて
□投稿者/ επιστημη (1890回)-(2009/04/16(Thu) 12:51:27)
επιστημη さんの Web サイト
> そうすれば、動画を表示する部分は、MFCで今までどおり作りで誰でも作れますし、C#の本体とは
> 別々にコーディング&テストが出来るだろうと期待しています。

あ、スキルとリソースが見込めるなら外野が口出しするこっちゃないですねー。

でもねーMFCてばアプリケーション全体のフレームワークですよねぇ、
そいつの土台/骨組みを無視して部屋とか窓とかだけ使わせてもらおうってんだから、
少なからず「かみ合わせの悪さ」が生じる思いますよ。

↓コレなんか「かみ合わせの悪さ」の典型例じゃないですかねぇ...

>> これはMFC側の初期化とかうまく行ってないとかですかねぇ...。
> そうですね、この手のパターンだと初期化処理が入っていないパターンですね。

引用返信 編集キー/
■35002 / inTopicNo.11)  Re[5]: C#→C++/CLI→C++(MFC)の呼び出しについて
□投稿者/ Blue (8回)-(2009/04/16(Thu) 12:59:28)
http://social.msdn.microsoft.com/Forums/ja-JP/vcgeneralja/thread/d941af82-e0a1-4993-bbab-27193287b0fd
参考になりますか?
引用返信 編集キー/
■35003 / inTopicNo.12)  Re[6]: C#→C++/CLI→C++(MFC)の呼び出しについて
□投稿者/ noridon (7回)-(2009/04/16(Thu) 13:05:40)
> http://social.msdn.microsoft.com/Forums/ja-JP/vcgeneralja/thread/d941af82-e0a1-4993-bbab-27193287b0fd
> 参考になりますか?

有難うございます。
ここは自分で見もつけて、やってみたのですが、
エントリポイントwWinMainCRTStartupに設定すると、
リンク時に_wWinMain@16が無いと言われてしまいます。
何か指定するライブラリが足りないのでしょうか?

引用返信 編集キー/
■35004 / inTopicNo.13)  Re[7]: C#→C++/CLI→C++(MFC)の呼び出しについて
□投稿者/ Blue (9回)-(2009/04/16(Thu) 13:07:51)
クラスライブラリの場合はよくわからない。
引用返信 編集キー/
■35006 / inTopicNo.14)  Re[8]: C#→C++/CLI→C++(MFC)の呼び出しについて
□投稿者/ noridon (8回)-(2009/04/16(Thu) 13:24:37)
> Blue さん

wWinMain@16の解決に試行錯誤してみます。
有難うございました。

> επιστημη さん
> でもねーMFCてばアプリケーション全体のフレームワークですよねぇ、
> そいつの土台/骨組みを無視して部屋とか窓とかだけ使わせてもらおうってんだから、
> 少なからず「かみ合わせの悪さ」が生じる思いますよ。

そうなんですよね。
MFCを含めたクラスとして持って来るのが無理そうなら、OCXにでもするか、MFCは使わずSDKレベルで頑張るか...。
早く全体をC#で作れるようにしたいのですが、まずは社内の啓蒙から始めるという始末でして...。
引用返信 編集キー/
■35008 / inTopicNo.15)  Re[5]: C#→C++/CLI→C++(MFC)の呼び出しについて
□投稿者/ 渋木宏明(ひどり) (1117回)-(2009/04/16(Thu) 14:01:37)
渋木宏明(ひどり) さんの Web サイト
> そこで、DirectShowが使いたいのですが、権利の問題からDirectShow.Netは使えません。
> となると、自分で同程度の機能を持ったラッパーを作るか、それとも表示部だけは今までどおりC++(MFC)で
> コーディングしてしまい、その表示関係のクラスをC#から呼び出せないかと考えているのです。

なら、C++ 実装部分を ActiveX コントロールにまとめてしまって、それを C# アプリケーションの Form に貼り付ける方が簡単なんじゃないすか?
引用返信 編集キー/
■35009 / inTopicNo.16)  Re[6]: C#→C++/CLI→C++(MFC)の呼び出しについて
□投稿者/ noridon (9回)-(2009/04/16(Thu) 14:20:14)
有難うございます。

> なら、C++ 実装部分を ActiveX コントロールにまとめてしまって、それを C# アプリケーションの Form に貼り付ける方が簡単なんじゃないすか?

やっぱりそうですかねー。
クラスライブラリのままもってこれれば、ActiveX化する手間が省けるかと思ったのですが。
色々チャレンジしてみたいと思います。

wWinMain@16の問題は、全部をUNICODE指定でビルドしたら、うまく行きました。
ただし、今度は、

>'System.BadImageFormatException' のハンドルされていない例外が DSTestApps.exe で発生しました。
>追加情報: メモリ ロケーションへのアクセスが無効です。 (HRESULT からの例外: 0x800703E6)

というメッセージでウィンドウすら出なくなってしまいました...(涙
引用返信 編集キー/
■35010 / inTopicNo.17)  Re[7]: C#→C++/CLI→C++(MFC)の呼び出しについて
□投稿者/ 渋木宏明(ひどり) (1118回)-(2009/04/16(Thu) 14:27:48)
渋木宏明(ひどり) さんの Web サイト
> 何か指定するライブラリが足りないのでしょうか?

エラーの直接の原因はそのとおり。

でも、クラスライブラリとして扱おうとしているはずの MFC のコードに、スタートアップが必要になるようなコードが混じってること自体がおかいっしょ。

そんな実力で C# の Form に直接 MFC の CWnd 乗っけようとするくらいなら、ActiveX コントロール作る方がよっぽど可能性があると思う。

引用返信 編集キー/
■35012 / inTopicNo.18)  Re[7]: C#→C++/CLI→C++(MFC)の呼び出しについて
□投稿者/ 渋木宏明(ひどり) (1119回)-(2009/04/16(Thu) 14:49:06)
渋木宏明(ひどり) さんの Web サイト
2009/04/16(Thu) 14:53:29 編集(投稿者)
2009/04/16(Thu) 14:51:49 編集(投稿者)

>>なら、C++ 実装部分を ActiveX コントロールにまとめてしまって、それを C# アプリケーションの Form に貼り付ける方が簡単なんじゃないすか?
>
> やっぱりそうですかねー。

僕の経験では、UI 部分については、明らかにそうです。

ウィザードの言いなりでも、現状よりはましなところまでたどり着けるはずです。
ですが、高度な応用や問題解決をするためには、どうしても COM/OLE に関する知識が必要になります。

> クラスライブラリのままもってこれれば、ActiveX化する手間が省けるかと思ったのですが。

純粋なロジックだけなら、C++/CLI でラップする方が手軽です。
が、UI に関してはそう簡単にはいきません。機械的な判断はよくないです。

> wWinMain@16の問題は、全部をUNICODE指定でビルドしたら、うまく行きました。

結果、うまくいっただけげ原因の究明はしませんでした?
うっすらとしか覚えてないけど、VC++2005 あたりだと文字列?周りのライブラリで簡単に不整合が出たような記憶があります。

引用返信 編集キー/
■35013 / inTopicNo.19)  Re[8]: C#→C++/CLI→C++(MFC)の呼び出しについて
□投稿者/ 渋木宏明(ひどり) (1120回)-(2009/04/16(Thu) 14:57:32)
渋木宏明(ひどり) さんの Web サイト
> うっすらとしか覚えてないけど、VC++2005 あたりだと文字列?周りのライブラリで簡単に不整合が出たような記憶があります。

少し思い出した。

「wchar_t をネイティブ型として扱う」とかいうオプションの有無で変化したような。

引用返信 編集キー/
■35015 / inTopicNo.20)  Re[9]: C#→C++/CLI→C++(MFC)の呼び出しについて
 
□投稿者/ noridon (10回)-(2009/04/16(Thu) 15:02:55)
No35013 (渋木宏明(ひどり) さん) に返信
>>うっすらとしか覚えてないけど、VC++2005 あたりだと文字列?周りのライブラリで簡単に不整合が出たような記憶があります。
>
> 少し思い出した。
>
> 「wchar_t をネイティブ型として扱う」とかいうオプションの有無で変化したような。


そうですね。
wchar_tをビルドイン型として扱うかどうかは、チェックをはずしました。

MFCを用いる部分は、DLL(MFC拡張)になっているのですが、それをC++から呼び出すのは問題なく出来ていたのですが、
さっき動かしてみたら、C++からも同じAssertが出るようになっていました。
何か根本的におかしいようですね。
書いたコード量も少ないので、また始めからトライしたいと思います。

有難うございました。
また、判らない事があったら、質問させて下さい。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -