我正在尝试在 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