我正在尝试将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
指针传递为更高效的方向。
答案 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);
}