C# Marshal / Pinvoke CBitmap?
Posted
技术标签:
【中文标题】C# Marshal / Pinvoke CBitmap?【英文标题】:C# Marshal / Pinvoke CBitmap? 【发布时间】:2010-12-16 04:03:04 【问题描述】:我不知道如何将 C++ CBitmap 编组为 C# Bitmap 或 Image 类。
我的导入如下所示:
[DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr GetBitmap(System.IntPtr hwnd, int nBMPWIDTH, int nBMPHEIGHT);
H 文件部分如下所示:
Cbitmap* GetBitmap(HWND hwnd,int nBMPWIDTH,int nBMPHEIGHT);
如何将 Cbitmap 转换为可以在 C# 中显示的内容?
非常感谢。
【问题讨论】:
【参考方案1】:.NET Framework 中最接近的 API 是 Image.FromHbitmap,但这需要您从 CBitmap 中提取 HBITMAP,而这在 C# 中是无法做到的(至少在不了解 CBitmap 内部结构的情况下不能这样做)。如果您可以修改 C++ GetBitmap 函数以返回 HBITMAP 而不是 CBitmap 包装器,那将是最简单的解决方案。这对你来说是一个选择吗?
【讨论】:
第二。您必须从 CBitmap 中获取 HBITMAP,这必须在 C++ 中完成。从技术上讲,您可以编组一个类,但您必须知道它的确切内存布局。 我无权访问 c++ dll 源。我能做些什么?谢谢。 创建一个小的C++函数如下: HBITMAP GetHandle(CBitmap* pBitmap) return (HBITMAP)( * pBitmap); 。然后 P/Invoke 这个,传递你的 CBitmap IntPtr。返回的 IntPtr 是 HBITMAP。 (仍然有 CBitmap * 的原因是你可以推迟释放它,直到你完成 HBITMAP;否则我相信 CBitmap 析构函数会为你丢弃句柄。) 我会在托管 CLR c++ 中创建这个 C++ 函数吗?还是win32?谢谢。 我在想原生 C++。但是你可能是对的,它也可以在 C++/CLI 中完成,在这种情况下,你不需要 P/Invoke 包装器,因为它是一个 .NET 到 .NET 的调用(以及向本机的转换代码将发生在您的 C++/CLI 程序集中)。以上是关于C# Marshal / Pinvoke CBitmap?的主要内容,如果未能解决你的问题,请参考以下文章