8

を所有するクラスがあるとしましょうD3DDevice

class Thing
{
public:
    Thing()
    {
        D3D11CreateDevice(..., &device, ...);
    }
    ~Thing()
    {
        device->Release();
    }
private:
    ID3D11Device* device;
};

私が理解していることから、デストラクタ_com_ptr_tを明示的に呼び出さなくても、オブジェクトが確実に削除されるようにするために使用できます。Release()ただし、問題は、テンプレートの正しい構文がわからないことです。

の情報はほとんど見つかりませんでし_com_ptr_tたが、答えに一番近いのはこれ(日本語)でした。そこでの構文に続いて、私はたくさんのコンパイラエラーを受け取ります:

private:
    //ID3D11Device* device;
    _com_ptr_t <_com_IIID<ID3D11Device, &__uuidof(ID3D11Device)>> device;

error C2143: syntax error : missing ';' before '<'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2238: unexpected token(s) preceding ';'
error C2065: 'device' : undeclared identifier

ちなみに、これを使用して関数からCOMポインターを返し、呼び出し元のスコープを離れたときに確実に削除されるようにすることができます。

4

3 に答える 3

25

_com_ptr_tは、スマートポインタータイプを定義するためのものです。たとえば、IHTMLDocument3Ptrタイプを定義しましょう。

typedef _com_ptr_t <_com_IIID<IHTMLDocument3, &__uuidof(IHTMLDocument3)>> IHTMLDocument3Ptr;

そのためのこの単純なマクロがあります:

_COM_SMARTPTR_TYPEDEF(IHTMLDocument3, IID_IHTMLDocument3);

これにより、スマートポインタであるIHTMLDocument3Ptrが作成されます。

IHTMLDocument3Ptr htmlDocument3;

CComQIPtrを使用すると、これは次のように定義されます。

CComQIPtr<IHTMLDocument3> htmlDocument3;

多くのCOMインターフェース用に事前定義されたスマートポインターを含む「comdefsp.h」ファイルがあります(https://singularity.svn.codeplex.com/svn/base/Windows/Inc/comdefsp.h)。「comdef.h」ファイルには自動的に含まれます。たとえば、IDispatchのスマートポインタはすでに定義されています。

IDispatchPtr dispatch;

CComPtrを使用すると、これは次のように定義されます。

CComPtr<IDispatch> dispatch;

_com_ptr_t=ATLなし

_com_ptr_toverを使用する利点は、ATLライブラリにリンクする必要がないことCComPtr/CComQIPtrです。

ATLライブラリを必要としない他のスマートCOMポインタは、_bstr_t(と同等CComBSTR)と_variant_t(と同等CComVariant)です。

于 2013-01-31T13:41:02.290 に答える
10

私がお勧めするCOMスマートポインタを処理する方法は通常2つあります。

1)適切なタイプライブラリを#importできます。これにより、_com_ptr_tに基づいてスマートポインタタイプが自動生成されます。

2)CComPtrテンプレートを使用して、生のCOMポインターをスマートポインターでラップできます。スマートポインターは、自動AddRef / Release呼び出しを介してリソース管理を処理しますが、それ以外のことはほとんど行いません。

私は少し怠惰で、通常はによって自動生成されたラッパーの暗黙のオーバーヘッドを気にしないので、#import通常は1)を使用します。このアプローチを使用する大きな利点の1つは、この#importメカニズムが関数ラッパーを生成し、COM関数を適切な戻り型と例外オブジェクトHRESULTへの変換を備えた通常の関数のように見せることです。_com_errorC++COMコードの制御フローを改善する傾向があるIMHO。

于 2012-04-14T13:18:43.380 に答える
3

質問の2番目のコードのエラーは、コンパイラがタイプの1つ(または両方)を認識していないことを意味します。両方を確実に有効で既知のタイプ<にするために、適切なヘッダーを含める必要があります。また、は「右シフト」演算子として解析される場合があります。適切でポータブルな解析を可能にするために、それらの間にスペースを入れてください。_com_ptr_t_com_IIID>>

comdef.h両方の問題を修正する必要があります(リストされているコードを参照)

于 2012-04-14T13:17:12.473 に答える