【问题标题】:System.Drawing.Image to Visual C++/MFC Picture ControlSystem.Drawing.Image 到 Visual C++/MFC 图片控件
【发布时间】: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


【解决方案1】:

为了将来参考,事实证明我做得对。 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);
}

【讨论】:

    猜你喜欢
    • 2013-06-29
    • 2016-06-02
    • 2019-06-06
    • 2023-03-30
    • 2014-01-09
    • 2015-09-28
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    相关资源
    最近更新 更多