DISPATCH_PROPERTYPUT 封装方法
时间: 2023-07-28 22:10:12 浏览: 87
以下是一个示例的封装方法可以用于实现 DISPATCH_PROPERTYPUT:
```c++
HRESULT SetProperty(IDispatch* pDispatch, LPCWSTR propertyName, VARIANT value)
{
HRESULT hr = S_OK;
DISPID dispid;
BSTR bstrName = SysAllocString(propertyName);
if (bstrName == NULL)
{
return E_OUTOFMEMORY;
}
hr = pDispatch->GetIDsOfNames(IID_NULL, &bstrName, 1, LOCALE_USER_DEFAULT, &dispid);
if (SUCCEEDED(hr))
{
DISPPARAMS dispparams = { NULL, NULL, 1, 1 };
VARIANTARG vararg = { 0 };
vararg.vt = value.vt;
if (value.vt == VT_BSTR)
{
vararg.bstrVal = SysAllocString(value.bstrVal);
if (vararg.bstrVal == NULL)
{
hr = E_OUTOFMEMORY;
}
}
else
{
VariantCopy(&vararg, &value);
}
if (SUCCEEDED(hr))
{
dispparams.rgvarg = &vararg;
UINT uArgErr;
EXCEPINFO excepInfo = { 0 };
hr = pDispatch->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT, &dispparams, NULL, &excepInfo, &uArgErr);
}
VariantClear(&vararg);
}
SysFreeString(bstrName);
return hr;
}
```
该方法的实现流程如下:
1. 通过 GetIDsOfNames 方法获取指定属性的 DISPID。
2. 创建一个包含指定属性值的 VARIANT 变量 vararg。
3. 创建一个包含一个 VARIANT 变量的 DISPPARAMS 结构体变量 dispparams。
4. 调用 IDispatch::Invoke 方法,设置 DISPPARAMS 中的 rgvarg 指向 vararg 变量的地址,并将 dwFlags 参数设置为 DISPATCH_PROPERTYPUT,以设置该属性的值。
5. 清理资源并返回方法的 HRESULT。
阅读全文