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