System.Drawing.Image到Visual C ++ / MFC Picture Control

时间:2012-01-11 21:01:25

标签: c# visual-c++ com mfc interop

我正在尝试将System.Drawing.Image(在.NET dll中生成)放入Visual C ++ / MFC应用程序中的图片控件中。我是COM / Interop的新手,但我有互操作的工作。但是我不确定如何将位图数据从C#传递给C ++。

基本过程是:
1. C ++ / MFC调用COM服务器(互操作)
2. C#COM服务器调用.NET DLL
3.在.NET dll中生成System.Drawing.Image 4. C#COM服务器以某种形式返回位图数据(互操作)
5. C ++ / MFC显示位图

在C#COM服务器中,我有:

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

img是我要发送的System.Drawing.Image。该方法返回IntPtr,它被封送到long*

在我的MFC C ++测试应用程序中,我有:

long pOutHB;

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

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

但没有任何东西放在图片控件中。我还尝试使用CBitmap创建HBITMAP,但这也不成功。我已经验证.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 个答案:

答案 0 :(得分:0)

为了将来的参考,事实证明我正确地做到了。 HBITMAP句柄有效并且在从.NET函数返回并通过COM互操作后仍然存在。根据MSDN,您需要清理对象。

添加一些清理,这是有效的。 Generate是对COM包装器服务的调用,它返回IntPtr,它被封送到long

long pOutHB;

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

HBITMAP hb1 = (HBITMAP) pOutHB;

HBITMAP oldHB = m_QRCodePicture.SetBitmap(hb1);
if (oldHB)
{
    DeleteObject(oldHB);
}