2010-07-16 24 views
1

Je suis en train de conclure des données à partir d'un tableau d'octets dans un VARIANT mais je ne peux pas sembler libérer les données:VariantClear() renvoie une exception lorsqu'il est appelé sur un VARIANT contenant un SAFEARRAY

Quand je exécuter ce code ...

SAFEARRAY * NewSArray; 

SAFEARRAYBOUND aDim[1]; // a one dimensional array 
aDim[0].lLbound = 0; //Sets the index to start from 0 

//Sets the number of elements (bytes) that will go into the SAFEARRAY 
aDim[0].cElements = pBuffer->GetSize(); 

NewSArray = SafeArrayCreate(VT_UI1, 1, aDim); // create a 1D SafeArray of BYTES 

//Put the data from the man view into the SAFEARRAY 
NewSArray->pvData = pBuffer->GetBuffer(); 

//FP Spread expects the spreadsheet data in the form of a VARIANT so we must pack the data from the SAFEARRAY into a 
//VARIANT 
VARIANT SpreadsheetBuffer; 
VariantInit(&SpreadsheetBuffer); 

SpreadsheetBuffer.vt= VT_ARRAY | VT_UI1; // set type to an array of bytes 
SpreadsheetBuffer.parray= NewSArray; 

try 
{ 
    VariantClear(&SpreadsheetBuffer); 
} 
catch (char *str) 
{ 
    AfxMessageBox(str); 
} 

Je reçois ce message: "exception Unhandeled à ... en ... 0xC015000F: le contexte d'activation étant désactivée est pas le plus récemment activé un."

Ce message ne s'affiche pas dans mon AfxMessageBox. Cela semble avoir quelque chose à voir avec le type de variant car si je ne le mets pas, je n'obtiens pas l'exception. Les données dans pBuffer sont juste un tableau BYTE qui a été précédemment retiré d'un SAFEARRAY.

quelqu'un sait ce que je fais mal?

grâce

+0

L'exception n'a aucun lien avec votre extrait de code. Faites en sorte que le débogueur s'arrête sur l'exception non gérée et publiez le contenu de la fenêtre de pile d'appel dans votre question. Assurez-vous que vous avez activé le serveur de symboles Microsoft. –

Répondre

2

SafeArrayCreate crée un tableau sécurisé et alloue de la mémoire pour le membre pvData. Vous ne devez pas réinitialiser le membre pvData après cela. Vous devez copier vos données de pBuffer dans ce pvData ou utiliser les fonctions SafeArrayAccessData ou SafeArrayPutElement.

+0

Merci beaucoup! Tout fonctionne maintenant. – rob