【发布时间】:2012-02-08 05:43:53
【问题描述】:
我正在尝试将System.Drawing.Image(在 .NET dll 中生成)放入 Visual C++/MFC 应用程序中的图片控件中。我是 COM/Interop 的新手,但我有互操作的工作。但是我不确定如何将位图数据从 C# 传递到 C++。
基本流程是:
1. COM 服务器上的 C++/MFC 调用(互操作)
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();
但是没有任何东西放在图片控件中。我还尝试使用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++ 应用程序是唯一感兴趣的。
标签: c# visual-c++ com mfc interop