Я уже некоторое время сражаюсь с Canon EDSDK. Я могу успешно получить библиотеку, чтобы сохранить файл непосредственно на диск, однако я не могу ухватить изображение байта [] в памяти. Всякий раз, когда я пытаюсь маршал.Copy() поток EDSDK в байт [], я всегда получаю следующую ошибку:Canon EDSDK MemoryStream Изображение
AccessViolationException: Попытка чтения или записи защищенной памяти. Это часто свидетельствует о том, что другая память повреждена.
Ниже один из вариантов кода, который я использовал, чтобы попытаться получить поток:
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;
}
Breakpoints раскрыть (через объект EdsDirectoryItemInfo), что изображение является действительно есть, я просто дон Я знаю, почему я получаю исключение, которое я есть. Я играл с идеей принять поражение и просто прочитал результирующий образ с диска, который он так легко пишет с помощью метода CreateFileStream, но мне действительно нужно просто управлять изображением в памяти.
Любые идеи?
UPDATE: Я вижу это поведение в обеих версиях 2.5 и 2.6.
Вы не возражаете размещения кода (где-то), чтобы загрузить изображение, которое вы только что взяли на диск? Я даже не могу зайти так далеко. В частности, я не могу заставить его вызвать функцию обработчика событий объекта. – andrewrk