我在从 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;
}
请给我一个工作样本。
使用 SafeArrayPtrOfIndex 时,存在额外的间接级别,因此您应该像这样更改代码:
void* data;
SafeArrayPtrOfIndex(sa, &idx, &data);
auto disp = *(IDispatch**)data;
disp->AddRef();
或者只使用 SafeArrayGetElement:
IDispatch* disp;
SafeArrayGetElement(psa, &idx, &disp);
data->AddRef();