C++ 从 VT_DISPATCH 类型的 SafeArray 获取 IDispatch 指针

问题描述 投票:0回答:1

我在从 VT_DISPATCH 类型的 SAFEARRAY 确定有效的 IDispatch 指针时遇到问题。

什么是正确的做法?

到目前为止,我的经验是,在尝试 AddRef 指针时总是会遇到异常。

    if (vtS == VT_DISPATCH) {
        IDispatch* iDisp = NULL; void* pData = NULL;
        if (idx) {
            ret = SafeArrayPtrOfIndex(SA, idx, &pData);
            if (ret) goto CleanUp;
        }
        iDisp = (IDispatch*)pData;
        iDisp->AddRef();
        pVGet->vt = VT_DISPATCH;
        pVGet->pdispVal = iDisp;
    }

请给我一个工作样本。

c++ com
1个回答
0
投票

使用 SafeArrayPtrOfIndex 时,存在额外的间接级别,因此您应该像这样更改代码:

void* data;
SafeArrayPtrOfIndex(sa, &idx, &data);

auto disp = *(IDispatch**)data;
disp->AddRef();

或者只使用 SafeArrayGetElement:

IDispatch* disp;
SafeArrayGetElement(psa, &idx, &disp);
data->AddRef();
© www.soinside.com 2019 - 2024. All rights reserved.