Ich habe folgenden CodeblockProblem mit Safearray Zugang CComVariant Verwendung
/////////////////////////////////////
CComVariant newVal;
//pass the CComVariant and get the strings array!!!
GetStrList(newVal);
USES_CONVERSION;
if (((newVal.vt & VT_ARRAY) == VT_ARRAY) && ((newVal.vt & VT_BSTR) == VT_BSTR))
{
SAFEARRAY* paArray = newVal.parray;
BSTR * str = NULL;
SafeArrayAccessData(paArray, (void**)&str);
SafeArrayUnaccessData(paArray);
long lLBound = 0;
long lUBound = 0;
long nCount = 0;
if (FAILED(SafeArrayGetLBound(paArray, 1, &lLBound)) ||
FAILED(SafeArrayGetUBound(paArray, 1, &lUBound)))
{
ASSERT(false);
return FALSE;
}
nCount = (lUBound - lLBound + 1);
for (int i = 0 ; i < nCount ; i++)
{
m_cstrList.AddString(W2T(str[i]));
}
//SafeArrayDestroy(paArray); ---> is it required here???
}
/////////////////////////////////////
Verfahren die sichere Arrays ist
HRESULT GetStrList(VARIANT *pVal)
{
USES_CONVERSION;
if (!pVal)
return E_FAIL;
SAFEARRAYBOUND bound[1]; //single dimension array
bound[0].lLbound = 0;
bound[0].cElements = 10;
SAFEARRAY * A = SafeArrayCreate(VT_BSTR, 1, bound);
BSTR * str = NULL;
SafeArrayAccessData(A, (void**)&str);
//user wants the NT view OPC drivers list.
for (int i=0;i<10;i++)
{
str[i] = SysAllocString(T2W(mystrings[i]));
}
VariantInit(pVal);
pVal->vt = VT_ARRAY | VT_BSTR;
pVal->parray = A;
SafeArrayUnaccessData(A);
A = NULL;
return S_OK;
}
My Zweifel returing oberhalb erster Block von Code hat keine Speicherlecks? Handelt sich die CComVariant
selbst um die Reinigung? oder mache ich auch manuell SafeArrayDestroy(paArray);
Vielen Dank im Voraus!
wenn ich SafeArrayDestroy mache (paArray); dann bekomme ich keine Abstürze. Laut Ihnen sollte CComVariant auch das gleiche Array wieder zerstören und versuchen, das bereits zerstörte Array zu zerstören. – coolcake
Nun, ja. Vielleicht stürzt es nicht zufällig ab, aber MSDN sagt, dass VariantClear() nicht gesperrte Arrays freigibt. Der Versuch, sie manuell freizugeben, würde zu einer doppelten Freigabe führen, die überhaupt nicht gut ist. – sharptooth
Also sollte ich nicht SafeArrayDestroy für CComVariant verwenden? – coolcake