次のように定義された多くのプロパティを含むインターフェイスを持つ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::」の部分を呼び出しから削除する方法をまだ探しています。