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;
ここでimg
はSystem.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
ポインタを渡すという方向で私に指摘していました。
DLLがアプリケーションと異なるプロセスで実行されている場合、それらの間でビットマップを共有することはできません。 GDIハンドルは、それらを作成したプロセス内でのみ有効です。 –
プロセスエクスプローラは、ラッパーDLL(C#COMサーバー)とC++アプリケーションPIDによって開かれた(および開かれた).NET DLLを表示します。私が見ていない別のプロセスからCOM呼び出しが起動されない限り、C++アプリケーションだけが関心のあるように見えます。 – bgh10788