5

C++に対するMicrosoft固有の拡張機能を使用するコードがあります。

interface __declspec(uuid("F614FB00-6702-11d4-B0B7-0050BABFC904"))
ICalculator : public IUnknown
{ 
    //...
};

この文は何に拡張されますか?どうすればANSIC++で書き直すことができますか?

4

2 に答える 2

6

これはマクロではないため、何にも「拡張」されません。これは、オブジェクトファイルメタデータ内の特定のUUIDで型を装飾するだけであり、後で__uuidof演算子を使用して抽出できます。

于 2011-06-02T20:26:52.413 に答える
5

GUIDをインターフェイスに静的に「アタッチ」する必要がある場合は、テンプレート(トレイト)を使用することもできます。検討:

一般的なhファイルで、空の特殊化されていないテンプレートを作成します。

template<typename TInterface> struct TInterfaceTraits {}

インターフェイスを定義するときは、そのためのテンプレートの特殊化を記述します(または、使用直前を含む他の場所に記述できます)。

class ICalculator : public IUnknown
{ 
    //...
};
template<> struct TInterfaceTraits<class ICalculator > { 
    static GUID guid() { 
        return IID_ICalculator ; 
    } 
};

次に、uuidを取得するには、次のように記述します。

ICalculator *pCalcFace;
pObject->QueryInterface(TInterfaceTraits<ICalculator>::guid(), (void**)pCalcFace);

当然のことながら、QueryInterfaceにテンプレートラッパーを作成できます(これは、トレイトを使用して適切なGUIDを自動的に提供します。これにより、さらに使いやすくなります。

ICalculator *pCalcFace = QueryInterface<ICalculator>(pObject);
于 2011-09-06T08:19:34.413 に答える