Je me bats avec le Canon EDSDK depuis un moment. Je peux obtenir avec succès la bibliothèque pour enregistrer un dossier directement sur le disque, cependant, je ne peux pas obtenir l'octet d'image [] dans la mémoire. Chaque fois que je tente Marshal.Copy() le flux EDSDK à byte [], j'obtiens toujours l'erreur suivante:Canon Image EDSDK MemoryStream
AccessViolationException: Tentative de lecture ou d'écriture de la mémoire protégée. C'est souvent une indication que l'autre mémoire est corrompue.
Ci-dessous est l'une des variantes de code que j'ai utilisé pour essayer d'obtenir le flux:
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;
}
révèlent les points d'arrêt (à travers l'objet EdsDirectoryItemInfo) que l'image est bien là, je viens de don Je ne sais pas pourquoi je recevrais l'exception que je suis. J'ai joué avec l'idée d'accepter la défaite et juste lu l'image résultante à partir du disque qu'il écrit si facilement via la méthode CreateFileStream, mais je devrais juste être capable de manipuler l'image en mémoire.
Des idées?
MISE À JOUR: je vois ce comportement dans les versions 2.5 et 2.6.
-vous l'esprit poster votre code (quelque part) pour télécharger l'image que vous venez de prendre sur le disque? Je ne peux même pas aller aussi loin. Plus précisément, je n'arrive pas à appeler ma fonction de gestionnaire d'événement d'objet. – andrewrk