ゼロからのCOM - サンプルCOMクライアント

いちごパック > COM/ActiveXの解説 > ゼロからのCOM - サンプルCOMクライアント

サンプルCOMクライアント

ゼロからのCOM - クラスの作成とその利用で説明したサンプルプログラムです。 コード全体をコピーしたい場合は、著作権表示といちごパックへのリンクを残した形でコピーしてください。 サンプルコードとしてその一部を利用、参照いただくぶんには問題ありません。
COMを使う32ビットまたは64ビットプログラムの場合は、リンク時に次のライブラリを与えてください。
kernel32.libuser32.libadvapi32.librpcrt4.libole32.liboleaut32.lib
このサンプルプログラムでは、リンカにamstrmid.libも追加してください。
このコードをVisual C++のプロジェクトとしてビルドしたい場合は、次の準備を行ったうえでビルドしてください。
  • Visual C++ → Win32 → Win32プロジェクトを選択して空のプロジェクトを作成
  • サンプルコードを.cppファイルとして追加
  • プロジェクトのプロパティを開き、リンカの設定でリンク時のライブラリとして上記のライブラリを追加

  • //
    // Copyright (c) 2016 The Ichigopack Project (http://ichigopack.net/).
    //
    
    #include <windows.h>
    #include <ole2.h>
    #include <dshow.h>
    #include <iostream>
    #include <iomanip>
    
    #define PLAYSAMPLEW L"c:\\windows\\media\\chimes.wav"
    
    int main()
    {
        HRESULT hr;
        hr = CoInitialize(NULL);
        if ( FAILED(hr) ) {
            std::cout << "CoInitialize() error: " << hr << std::endl;
            return 1;
        }
        IMediaControl*  pIFMediaControl = NULL;
        IMediaEvent*    pIFMediaEvent = NULL;
        BSTR bstr = NULL;
        long evCode = 0;
        hr = CoCreateInstance(
                 CLSID_FilterGraph, NULL,
                 CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER |
                 CLSCTX_LOCAL_SERVER,
                 IID_IMediaControl, (LPVOID*)&pIFMediaControl);
        if ( SUCCEEDED(hr) )
            hr = pIFMediaControl->QueryInterface(
                     IID_IMediaEvent, (LPVOID*)&pIFMediaEvent );
        if ( SUCCEEDED(hr) ) {
            bstr = SysAllocString(PLAYSAMPLEW);
            if ( bstr == NULL ) {
                hr = E_OUTOFMEMORY;
            }
        }
        if ( SUCCEEDED(hr) ) {
            hr = pIFMediaControl->RenderFile( bstr );
            if ( FAILED(hr) ) {
                std::cout << "RenderFile failed." << std::endl;
            }
        }
        if ( SUCCEEDED(hr) ) {
            hr = pIFMediaControl->Run();
        }
        if ( SUCCEEDED(hr) ) {
            hr = pIFMediaEvent->WaitForCompletion( INFINITE, &evCode );
        }
        if ( pIFMediaControl != NULL ) {
            pIFMediaControl->Release();
        }
        if ( pIFMediaEvent != NULL ) {
            pIFMediaEvent->Release();
        }
        if ( bstr != NULL ) {
            SysFreeString( bstr );
        }
        if ( FAILED(hr) ) {
            std::cout << "COM error: "
                      << std::hex << std::setfill('0')
                      << std::setw(8) << hr << std::endl;
        }
        CoUninitialize();
        return 0;
    }
    
    

    関連ページ

  • COM/ActiveXの解説ページ 目次
  • クラスの作成とその利用