2012-01-11 8 views
1

Visual C++/MFCアプリケーションのピクチャコントロールにSystem.Drawing.Image(.NET dllで生成)を取得しようとしています。私はCOM/Interopの新機能ですが、私は相互運用性があります。しかし、C#のビットマップデータをC++に渡す方法がわかりません。Visual C++/MFCピクチャコントロールへのSystem.Drawing.Image

基本的なプロセスは、次のとおりです。
1. C++/MFCは、COMサーバーを呼び出し (相互運用)
2. C#のCOMサーバーが
3. .NETのDLL内System.Drawing.Imageを生成する.NET DLLを呼び出す
4. C#COM C#COMサーバ内のサーバが何らかの形でビットマップデータを返します(相互運用)
5. C++/MFCが表示ビットマップ

、私が持っている:

Bitmap bm = new Bitmap(img); 
IntPtr hbm = bm.GetHbitmap(); 
return hbm; 

ここでimgSystem.Drawing.Imageです。送信したいです。この方法は、私のMFC C++テストアプリケーションでlong*

にマーシャリングますIntPtrを返し、私が持っている:

long pOutHB; 

pQRCodePtr->Generate(m_sQRText.AllocSysString(), 50, 50, &pOutHB); 

HBITMAP hb = (HBITMAP) pOutHB; 
m_QRCodePicture.SetBitmap(hb); 
m_QRCodePicture.Invalidate(); 
m_QRCodePicture.UpdateData(); 

しかし、何も、ピクチャコントロールに入れなかっます。私もHBITMAPを使ってCBitmapを作成しようとしましたが、失敗しました。 .NET dll/COMサーバーが有効なイメージを生成していることを確認しました。

C++ビットマップを取り、System.Drawing.Imageを作る発見し、この問題に関する私の研究のほとんどは、(この質問のように: Safety of passing HBITMAP handle from unmanaged to managed code for created a System.Drawing.Bitmap)他の方向に行くのではない

私はここで正しい道を下って行くだろうか?私のコードは完全に間違っているかもしれないことに気付きました。私はここで正しい方向に私を向ける何かを探しています。私の最初の試みはbyte[]配列を渡すことでしたが、より効率的なものとしてHBitmapポインタを渡すという方向で私に指摘していました。

+1

DLLがアプリケーションと異なるプロセスで実行されている場合、それらの間でビットマップを共有することはできません。 GDIハンドルは、それらを作成したプロセス内でのみ有効です。 –

+0

プロセスエクスプローラは、ラッパーDLL(C#COMサーバー)とC++アプリケーションPIDによって開かれた(および開かれた).NET DLLを表示します。私が見ていない別のプロセスからCOM呼び出しが起動されない限り、C++アプリケーションだけが関心のあるように見えます。 – bgh10788

答えて

0

今後の参考として、私は正しく行っていたことが分かります。 HBITMAPハンドルは有効であり、.NET関数からの戻り後も保持され、COM相互運用機能を通過します。 MSDNによると、オブジェクトをクリーンアップする必要があります。

クリーンアップを追加すると、これが動作します。 Generateは、IntPtrを返し、longにマーシャリングされたCOMラッパーサービスへの呼び出しです。

long pOutHB; 

pQRCodePtr->Generate(m_sQRText.AllocSysString(), 200, 200, &pOutHB); 

HBITMAP hb1 = (HBITMAP) pOutHB; 

HBITMAP oldHB = m_QRCodePicture.SetBitmap(hb1); 
if (oldHB) 
{ 
    DeleteObject(oldHB); 
} 
関連する問題