Re: Problems with CComSafeArrays
ebresie <ebresie@gmail.com> wrote:
_variant_t vt;
CComSafeArrayBound bounds[1]; // 1 column
bounds[0].SetCount(2); // 2 rows
DWORD numElements[] = {1, 2}; // 1x2 array (single position)
CComSafeArray<double> saR(bounds, 1);
long index[2]; // used to identify the position in an array
double dValue;
// at (0,0)
index[0] = 0; index[1] = 0; dValue = 11.0;
saR.MultiDimSetAt(index, dValue);
You have a one-dimensional array. Only the first index (index[0]) is
used. In fact, you can just use a plain vanilla SetAt here.
This is not the cause of your immediate problems.
// at (0,1)
index[1] = 1; dValue = -22.6789;
saR.MultiDimSetAt(index, dValue);
Since index[1] is ignored, you are replacing the same value you've set
in a previous MultiDimSetAt call. The second element of the array,
meanwhile, remains uninitialized.
VariantInit(&vt);
vt.vt = VT_ARRAY | VT_R8;
vt.parray = saR;
Make it
vt.parray = saR.Detach();
Otherwise you have two smart classes both thinking they own underlying
SAFEARRAY* pointer. When these two objects go out of scope, you end up
with double destruction.
--
With best wishes,
Igor Tandetnik
With sufficient thrust, pigs fly just fine. However, this is not
necessarily a good idea. It is hard to be sure where they are going to
land, and it could be dangerous sitting under them as they fly
overhead. -- RFC 1925