我有一个 COM 对象,其接口包含许多按以下方式定义的属性:
[propget] HRESULT Width([out, retval] LONG *lValue);
要从 C++ 访问此类属性,我需要添加如下代码:
LONG lValue;
HRESULT hr = pInterface->get_Width(&lValue);
if (FAILED(hr)) lValue = DEFAULT_VALUE;
这个块不是太长,但是当使用许多属性时,代码变得不太好看。有没有办法将属性访问代码分成一些宏或模板函数,以便能够直接使用属性,如下所示:
printf("The width of the object is %d", GET_OBJECT_PROPERTY(pInterace, Width, DEFAULT_VALUE));
UPD:VC2008编译器用于构建项目
UPD:谢谢大家!这是我的解决方案:
template <class interface_type, class property_type>
property_type GetPropertyValue(interface_type* pInterface, HRESULT(STDMETHODCALLTYPE interface_type::*pFunc)(property_type*), property_type DefaultValue = 0)
{
property_type lValue;
HRESULT hr = (*pInterface.*pFunc)(&lValue);
if (FAILED(hr))
lValue = DefaultValue;
return lValue;
}
可以称为
LONG lVideoStreamCount = GetPropertyValue(pInfo, &IInterfaceName::get_VideoStreamCount);
我仍在寻找一种方法来从通话中消除此“IInterfaceName::”部分。