0

我正在尝试在 C++/CLI 中完成以下任务。

我有一个构建图像内容(位图)的本机类:

unsigned char* NativeClass:GetBitmapBits(void)

我想使用这些数据来创建托管 System.Drawing.Bitmap。我的第一个想法是使用构造函数:

Bitmap(
int width, 
int height, 
int stride, 
PixelFormat format, 
IntPtr scan0
)

我有这个工作,但现在遇到问题,以后使用此位图会导致 System.Drawing 中的第一次机会异常 System.AccessViolationException。我怀疑问题在于我没有正确管理非托管位图位(由本机方法返回)到将其传递给托管位图构造函数的转换。

我应该如何从第一个函数中获取本机指针并准备它(例如,我需要使用interior_ptr 还是pin_ptr?)并将其传递给需要IntPtr 的Bitmap 构造函数?

编辑:详细说明,这是我这样做的天真尝试:

virtual void OnPaint(PaintEventargs^ e) override
{
...
   unsigned char* bits = nativeClassObj->getBitmapBits();

   gcnew Bitmap(width, height, stride, PixelFormat::Format24bppRgb, (IntPtr)bits);

   e->Graphics->DrawImage((System::Drawing::Image^)managedBitmap,0,0);
...
}

.. 和结果(我在绘图窗口中得到一个“红色 X”):

A first chance exception of type 'System.AccessViolationException' occurred in System.Drawing.dll
4

0 回答 0