我有一个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 ::'部分。
答案 0 :(得分:0)
(正如汉斯已经在评论中提到的那样。真的。我发现C ++中的COM无法忍受)
这会在默认设置中生成一个高级包装器。像您这样的属性通过__decspec(property)公开,这是一个特定于编译器的扩展:
LONG lValue = pInterface->Width;
[edit]更多信息:
为了编译.idl,我禁用了MIDL的C头生成(如果需要,代理/存根生成除外)。
使用默认的#import设置:
_com_error
例外[out, retval]
转换为实际返回值,raw_Method()
,get_Property()
等__uuidof()
获取,例如__uuidof(IMyInterface)
代替IID_IMyInterface
。 但是,所有这些都可以通过#import属性进行配置。
我将.idl放在一个单独的项目中,只生成.tlb,我使用#imported标头来实现和使用接口。这意味着您必须对向导生成的代码进行soem调整,例如使用raw_