3

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

4

1 に答える 1

0

#import "myInterface.tlb"

(Hans が既にコメントに入れているように。本当に。C++ の COM は、それなしでは耐えられないと思います)

これにより、デフォルト設定では高レベルのラッパーが生成されます。あなたの例のようなプロパティは、コンパイラ固有の拡張機能である__decspec(property)を通じて公開されます。

LONG lValue = pInterface->Width;

[編集] 詳細:

.idl をコンパイルするために、MIDL の C ヘッダー生成を無効にします (必要に応じてプロキシ/スタブ生成を除く)。

デフォルトの #import 設定では:

  • あなたは高レベルのラッパーを手に入れます
    • _com_errorFAILED(hr) を例外に変える
    • 実際の戻り値に変わり[out, retval]
    • プロパティであるかのようにプロパティを公開します
    • など を介しraw_Method()て「元の」COMインターフェースへのアクセスを提供します 。get_Property()
  • GUID は__uuidof()、たとえば__uuidof(IMyInterface)の代わりに を介して利用できますIID_IMyInterface
  • すべての定義は、COM ライブラリの名前に基づく名前空間にあります

ただし、これらはすべて #import 属性で構成できます。

.idl を .tlb のみを生成する別のプロジェクトに配置し、インターフェイスの実装と使用の両方に #imported ヘッダーを使用します。これは、ウィザードで生成されたコードにいくつかの調整を加える必要があることを意味します。たとえば、COM メソッドの実装に接頭辞を付けるなどです。raw_

于 2012-04-27T12:41:42.927 に答える