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