合并两个SAFEARRAY - SafeArrayPutElement内存访问冲突

时间:2013-06-17 12:02:05

标签: com interop safearray

执行以下代码时,我遇到了一些内存访问冲突:

UINT cDims = 1;

SAFEARRAYBOUND rgsabound[1];
long lLbound = 0;
long lUbound = 0;

rgsabound[0].lLbound = 0;

rgsabound[0].cElements = pList1->rgsabound[0].cElements + pList2->rgsabound[0].cElements;


SAFEARRAY* mergeResult = SafeArrayCreate(VT_DISPATCH, cDims, reinterpret_cast<SAFEARRAYBOUND*>(rgsabound));

// Obtain bounds information of the SAFEARRAY. 
SafeArrayGetLBound(pList2, 1, &lLbound);
SafeArrayGetUBound(pList2, 1, &lUbound);

long lDimSize = lUbound - lLbound + 1;

    GoldMineConstantContactCOM::IBounceActivityPtr ptrActivity;

    SafeArrayCopy(pList1, &mergeResult);

    rgsabound[0].lLbound = 0;
    rgsabound[0].cElements = pList1->rgsabound[0].cElements + pList2->rgsabound[0].cElements;

    SafeArrayRedim(mergeResult, rgsabound);

    for (int i = 0; i < lDimSize; i++)
    {
        long rgIndices[1];
        rgIndices[0] = i;

        HRESULT hRes2 = SafeArrayGetElement(pList2, rgIndices, &ptrActivity);

        rgIndices[0] = rgIndices[0] + pList1->rgsabound[0].cElements;

        HRESULT hRes = SafeArrayPutElement(mergeResult, rgIndices, (void*)&ptrActivity);                
    }

    return mergeResult;

我收到的消息是:0x774115de处的未处理异常:0xC0000005:访问冲突读取位置0x00000004。

任何帮助都会非常有用!

提前致谢

此致    费边

1 个答案:

答案 0 :(得分:0)

&中的SafeArrayCopy(pList1, &mergeResult);引起了对文档确认的怀疑:该函数没有从源数组复制到您分配的函数,它会用新的数组覆盖指针(泄漏它)。相同的维度。但是,您对SafeArrayRedim的调用似乎会解决(部分)问题。

此外,您负责检索pList2的下限,但在实际复制期间不使用它。

然后,我不确定智能指针是否完全正确使用。我想也许你应该把它的声明放在循环中。

最后,我想我找到了真正的罪魁祸首:SafeArrayPutElement的文件说:

  

变量类型VT_DISPATCH,VT_UNKNOWN和VT_BSTR是指针,不需要其他级别的间接。

这意味着您应该移除&中的(void*)&ptrActivity