Archive for 5月 10th, 2012

  1. Hello, COM(ATL) World!

    Posted on 5月 10th, 2012 by cx20

    COM(ATL)

    COM(Component Object Model)はマイクロソフトの提唱するプログラム部品の仕様である。
    COM を用いて開発された部品であれば言語を問わず利用することができる。
    以下は Visual C++ / ATL による COM クライアント(事前バインディングならびに実行時バインディング)の例となっている。

    ソースコード(事前バインディング)

    #include <atlbase.h>
    #include <shlobj.h>
     
    int _tmain(int argc, TCHAR* argv[] )
    {
        CoInitialize( NULL );
     
        CComPtr<Folder> pFolder;
        CComPtr<IShellDispatch> pShell;
        pShell.CoCreateInstance( CLSID_Shell );
     
        CComVariant vRootFolder( ssfWINDOWS );
        pShell->BrowseForFolder( 0, L"Hello, COM(ATL) World!", 0, vRootFolder, &pFolder );
        if ( pFolder != NULL )
        {
            pFolder = NULL;
        }
        pShell = NULL;
     
        CoUninitialize();
     
        return 0;
    }

    ソースコード(実行時バインディング)

    #include <atlbase.h>
     
    int _tmain(int argc, TCHAR* argv[] )
    {
        CoInitialize( NULL );
     
        CComPtr<IDispatch> pShell;
        pShell.CoCreateInstance( L"Shell.Application" );
     
        DISPPARAMS param = { NULL, NULL, 0, 0 };
        CComVariant varg[4];
        varg[0] = 36L;  // VT_I4 ssfWINDOWS 
        varg[1] = 0L;   // VT_I4
        varg[2] = L"Hello, COM(ATL) World!"; //  VT_BSTR
        varg[3] = 0L;   // VT_I4
     
        CComVariant vResult;
        pShell.InvokeN(L"BrowseForFolder", varg, 4, &vResult );
     
        CComPtr<IDispatch> pFolder = vResult.pdispVal;
        if ( pFolder != NULL )
        {
            pFolder = NULL;
        }
        pShell = NULL;
     
        CoUninitialize();
     
        return 0;
    }

    コンパイル方法(Visual C++)

    C:¥> cl hello.cpp

    実行結果

    +----------------------------------------+
    |Browse For Folder                    [X]|
    +----------------------------------------+
    | Hello, COM(ATL) Wolrd!                 |
    |                                        |
    | +------------------------------------+ |
    | |[Windows]                           | |
    | | +[addins]                          | |
    | | +[AppCompat]                       | |
    | | +[AppPatch]                        | |
    | | +[assembly]                        | |
    | |     :                              | |
    | |     :                              | |
    | |     :                              | |
    | +------------------------------------+ |
    | [Make New Folder]    [  OK  ] [Cancel] |
    +----------------------------------------+