VariantClear()在包含SAFEARRAY的A VARIANT上调用时抛出异常

时间:2010-07-16 20:27:50

标签: c++ visual-c++ memory-leaks msdn variant

我试图将BYTES数组中的一些数据包装成VARIANT,但我似乎无法释放数据:

当我运行此代码时......

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);
}

我收到此消息: “在...中的无故障异常...... 0xC015000F:被激活的激活上下文不是最近激活的激活上下文。”

顺便说一句,此消息不会在我的AfxMessageBox中弹出。它似乎与变体类型有关,因为如果我没有设置它,我不会得到异常。 pBuffer中的数据只是一个以前从SAFEARRAY中拉出来的BYTE数组。

谁知道我做错了什么?

感谢

1 个答案:

答案 0 :(得分:2)

SafeArrayCreate创建一个安全数组并为pvData成员分配内存。在此之后,您不应重置pvData成员。您应该将数据从pBuffer复制到pvData个点,或使用SafeArrayAccessDataSafeArrayPutElement函数。