Com 合并两个SAFEARRAY';s-SafeArrayPutElement内存访问冲突

Com 合并两个SAFEARRAY';s-SafeArrayPutElement内存访问冲突,com,interop,safearray,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* mergeResul

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

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;
UINT-cDims=1;
SAFEARRAYBOUND rgsabound[1];
长界=0;
长吕本=0;
rgsabound[0].lLbound=0;
rgsabound[0]。cElements=pList1->rgsabound[0]。cElements+pList2->rgsabound[0]。cElements;
SAFEARRAY*mergeResult=SafeArrayCreate(VT_分派、CDIM、重新解释(rgsabound));
//获取SAFEARRAY的边界信息。
安全阵列绑定(pList2、1和lLbound);
安全阵列ETUBOUND(pList2、1和LUBOND);
长lDimSize=lUbound-lLbound+1;
Goldmine ConstantContactcom::IBounceActivityPtr ptrActivity;
安全阵列副本(pList1和合并结果);
rgsabound[0].lLbound=0;
rgsabound[0]。cElements=pList1->rgsabound[0]。cElements+pList2->rgsabound[0]。cElements;
SafeArrayRedim(合并结果,rgsabound);
对于(int i=0;irgsabound[0]。芹菜;
HRESULT hRes=SAFEARRAYPUTELENT(合并结果、合并条件、(无效*)&P实用性);
}
返回合并结果;
我得到的消息是:0x774115de处的未处理异常:0xC0000005:访问冲突读取位置0x00000004

任何帮助都会很有帮助

提前谢谢

问候,,
Fabian

安全阵列副本(pList1和MERGESULT)中的
引起了文档确认的怀疑:函数没有从源数组复制到分配的数组,它用相同维度的新数组覆盖指针(泄漏指针)。但是,您对
SafeArrayRedim
的调用似乎解决了(部分)问题

此外,您还负责检索pList2的下限,但在实际复制过程中不使用它

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

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

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


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

您可以使用ATL的CComSafeArray,它可以添加两个数组: