次の方法で共有


方法: CComPtr および CComQIPtr インスタンスを作成して使用する

従来の Windows プログラミングでは、多くの場合、COM オブジェクトとして (またはより正確には、COM のサーバー) ライブラリが実装されます。COM サーバーでは、Windows オペレーティング システム コンポーネントの多くが実装され、共同で、このフォーム ライブラリを提供します。COM の基本の詳細についてを参照してくださいComponent Object Model (COM)

コンポーネント オブジェクト モデル (COM) オブジェクトのインスタンスを作成すると、インターフェイス ポインターへの呼び出しを使用して、参照カウントを実行する COM スマート ポインター格納AddRefRelease 、デストラクターで。Active Template Library (ATL) または Microsoft Foundation クラス ライブラリ (MFC) を使用している場合は、使用、 CComPtrスマート ポインター。ATL または MFC を使用しない場合は、使用**_com_ptr_t**。同じ COM がないためstd::unique_ptr、1 つの所有者と複数の所有者の両方のシナリオではこれらのスマート ポインターを使用します。両方のCComPtrComQIPtrサポートは右辺値参照を持つ操作を移動します。

使用例

次の使用例を使用する方法を示していますCComPtr 、COM オブジェクトのインスタンスを作成し、そのインターフェイスへのポインターを取得します。CComPtr::CoCreateInstanceメンバー関数を使用して同じ名前を持つ Win32 関数の代わりに COM オブジェクトを作成します。

void CComPtrDemo()
{

    HRESULT hr = CoInitialize(NULL);

    // Declare the smart pointer.
    CComPtr<IGraphBuilder> pGraph;

    // Use its member function CoCreateInstance to
    // create the COM object and obtain the IGraphBuilder pointer.
    hr = pGraph.CoCreateInstance(CLSID_FilterGraph);
    if(FAILED(hr)){ /*... handle hr error*/ }

    // Use the overloaded -> operator to call the interface methods.
    hr = pGraph->RenderFile(L"C:\\Users\\Public\\Music\\Sample Music\\Sleep Away.mp3", NULL);
    if(FAILED(hr)){ /*... handle hr error*/ }

    // Declare a second smart pointer and use it to 
    // obtain another interface from the object.
    CComPtr<IMediaControl> pControl;
    hr = pGraph->QueryInterface(IID_PPV_ARGS(&pControl));
    if(FAILED(hr)){ /*... handle hr error*/ }

    // Obtain a third interface.
    CComPtr<IMediaEvent> pEvent;
    hr = pGraph->QueryInterface(IID_PPV_ARGS(&pEvent));
    if(FAILED(hr)){ /*... handle hr error*/ }

    // Use the second interface.
    hr = pControl->Run();
    if(FAILED(hr)){ /*... handle hr error*/ }

    // Use the third interface.
    long evCode = 0;
    pEvent->WaitForCompletion(INFINITE, &evCode);

    CoUninitialize();

    // Let the smart pointers do all reference counting.
}

CComPtrその親戚は、ATL の一部であり、atlcomcli.h に定義されています。_com_ptr_tcomip.h で宣言されています。特殊な形式のコンパイラを作成**_com_ptr_t**ラッパー クラスのタイプ ライブラリを生成するとします。

ATL をまた提供するCComQIPtrは、追加のインターフェイスを取得するには、COM オブジェクトのクエリを実行する、単純な構文があります。ただし、お勧めCComPtr 、すべてのでCComQIPtr行うことができ、生の COM インターフェイス ポインターを意味より一貫性のあります。使用すると、 CComPtrのインターフェイスを照会するには、新しいインターフェイス ポインターを out パラメーターに配置されます。呼び出しが失敗した場合は、COM の一般的なパターンは、HRESULT が返されます。CComQIPtr、ポインター自体が返され、呼び出しが失敗した場合は、内部の HRESULT の戻り値にアクセスできません。次の 2 行表示方法、エラー処理メカニズムでCComPtrCComQIPtrとは異なります。

// CComPtr with error handling:
CComPtr<IMediaControl> pControl;
hr = pGraph->QueryInterface(IID_PPV_ARGS(&pControl));
if(FAILED(hr)){ /*... handle hr error*/ }

// CComQIPtr with error handling
CComQIPtr<IMediaEvent> pEvent = pControl;
if(!pEvent){ /*... handle NULL pointer error*/ }

// Use the second interface.
hr = pControl->Run();
if(FAILED(hr)){ /*... handle hr error*/ }

CComPtrIDispatch が COM オートメーション コンポーネントへのポインターを格納し、実行時バインディングを使用して、インターフェイス上のメソッドを呼び出すことができますの特殊化を提供します。CComDispatchDrivertypedef のですCComQIPtr<IDispatch, &IIDIDispatch>に暗黙的に変換がCComPtr<IDispatch>。コードでこれら 3 つの名前のいずれかが表示される場合は、したがって、等価にはCComPtr<IDispatch>。次の使用例を使用して、Microsoft Word のオブジェクト モデルへのポインターを取得する方法を示しています、 CComPtr<IDispatch>

void COMAutomationSmartPointerDemo()
{

    CComPtr<IDispatch> pWord;
    CComQIPtr<IDispatch, &IID_IDispatch> pqi = pWord;
    CComDispatchDriver pDriver = pqi;

    HRESULT hr;
    _variant_t pOutVal;

    CoInitialize(NULL);
    hr = pWord.CoCreateInstance(L"Word.Application", NULL, CLSCTX_LOCAL_SERVER);    
    if(FAILED(hr)){ /*... handle hr error*/ }

    // Make Word visible.
    hr = pWord.PutPropertyByName(_bstr_t("Visible"),  &_variant_t(1));
    if(FAILED(hr)){ /*... handle hr error*/ }

    // Get the Documents collection and store it in new CComPtr
    hr = pWord.GetPropertyByName(_bstr_t("Documents"), &pOutVal);
    if(FAILED(hr)){ /*... handle hr error*/ }

    CComPtr<IDispatch> pDocuments = pOutVal.pdispVal; 

    // Use Documents to open a document
    hr = pDocuments.Invoke1 (_bstr_t("Open"), &_variant_t("c:\\users\\public\\documents\\sometext.txt"),&pOutVal);
    if(FAILED(hr)){ /*... handle hr error*/ }

    CoUninitialize();
}

参照

概念

スマート ポインター (Modern C++)