我正在尝试在C ++ / CLI中完成以下操作。
我有一个构建图像内容的本地类(位图):
unsigned char* NativeClass:GetBitmapBits(void)
我想使用此数据来创建托管的System.Drawing.Bitmap。我的第一个想法是使用构造函数:
Bitmap(
int width,
int height,
int stride,
PixelFormat format,
IntPtr scan0
)
我有点工作,但现在遇到的问题是,稍后使用此Bitmap会导致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