私はしばらくの間、キヤノンEDSDKと戦ってきました。私は正常にディスクに直接ファイルを保存するライブラリを取得することができますが、私は画像のバイト[]をメモリに保持することはできません。私がMarshal.Copy()にEDSDKストリームをバイト[]にしようとすると、私はいつも次のエラーを受け取ります:キヤノンEDSDKメモリストリーム画像
保護されたメモリを読み書きしようとしました。これはしばしば、他のメモリが壊れていることを示します。以下は
私はストリームを試してみて、取得するために使用したコードのバリエーションの一つである:
private uint downloadImage(IntPtr directoryItem)
{
uint err = EDSDK.EDS_ERR_OK;
IntPtr stream = IntPtr.Zero;
// Get information of the directory item.
EDSDK.EdsDirectoryItemInfo dirItemInfo;
err = EDSDK.EdsGetDirectoryItemInfo(directoryItem, out dirItemInfo);
// Create a file stream for receiving image.
if (err == EDSDK.EDS_ERR_OK)
{
err = EDSDK.EdsCreateMemoryStream(dirItemInfo.Size, out stream);
}
// Fill the stream with the resulting image
if (err == EDSDK.EDS_ERR_OK)
{
err = EDSDK.EdsDownload(directoryItem, dirItemInfo.Size, stream);
}
// Copy the stream to a byte[] and
if (err == EDSDK.EDS_ERR_OK)
{
byte[] buffer = new byte[dirItemInfo.Size];
GCHandle gcHandle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
// The following line is where it blows up...
Marshal.Copy(stream, buffer, 0, (int)dirItemInfo.Size);
// ... Image manipulation, show user, whatever
}
return err;
}
ブレークポイントは、私はちょうどドン、画像が実際にあること(EdsDirectoryItemInfoオブジェクトを介して)明らかになぜ私が例外であるのか分かりません。私は敗北を受け入れるというアイディアを借りて、ディスクから結果のイメージを読み込み、CreateFileStreamメソッドを使って簡単に書き込みますが、実際にはメモリ内のイメージを操作できるだけです。
アイデア?
更新:この現象は、バージョン2.5と2.6の両方で発生します。
?私はそれまでにさえ得られない。具体的には、オブジェクトイベントハンドラ関数を呼び出すことができません。 – andrewrk