例: [開く] ダイアログ ボックス

Shapes私たちが使用してきた例は、やや工夫されています。 実際の Windows プログラムで使用できる COM オブジェクトである [ 開く ] ダイアログ ボックスに目を向けましょう。

開いているダイアログ ボックスを示すスクリーン ショット

[ 開く ] ダイアログ ボックスを表示するには、プログラムで共通項目ダイアログ オブジェクトと呼ばれる COM オブジェクトを使用できます。 共通項目ダイアログには、ヘッダー ファイル Shobjidl.h で宣言されている IFileOpenDialog という名前のインターフェイスが実装されています。

ユーザーに [ 開く ] ダイアログ ボックスを表示するプログラムを次に示します。 ユーザーがファイルを選択すると、プログラムにファイル名を含むダイアログ ボックスが表示されます。

#include <windows.h>
#include <shobjidl.h> 

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
{
    HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | 
        COINIT_DISABLE_OLE1DDE);
    if (SUCCEEDED(hr))
    {
        IFileOpenDialog *pFileOpen;

        // Create the FileOpenDialog object.
        hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_ALL, 
                IID_IFileOpenDialog, reinterpret_cast<void**>(&pFileOpen));

        if (SUCCEEDED(hr))
        {
            // Show the Open dialog box.
            hr = pFileOpen->Show(NULL);

            // Get the file name from the dialog box.
            if (SUCCEEDED(hr))
            {
                IShellItem *pItem;
                hr = pFileOpen->GetResult(&pItem);
                if (SUCCEEDED(hr))
                {
                    PWSTR pszFilePath;
                    hr = pItem->GetDisplayName(SIGDN_FILESYSPATH, &pszFilePath);

                    // Display the file name to the user.
                    if (SUCCEEDED(hr))
                    {
                        MessageBoxW(NULL, pszFilePath, L"File Path", MB_OK);
                        CoTaskMemFree(pszFilePath);
                    }
                    pItem->Release();
                }
            }
            pFileOpen->Release();
        }
        CoUninitialize();
    }
    return 0;
}

このコードでは、モジュールの後半で説明するいくつかの概念を使用するため、ここですべてを理解していない場合は心配しないでください。 コードの基本的な概要を次に示します。

  1. CoInitializeEx を呼び出して COM ライブラリを初期化します。
  2. CoCreateInstance を呼び出して、共通項目ダイアログ オブジェクトを作成し、オブジェクトの IFileOpenDialog インターフェイスへのポインターを取得します。
  3. ユーザーにダイアログ ボックスを表示するオブジェクトの Show メソッドを呼び出します。 このメソッドは、ユーザーがダイアログ ボックスを閉じるまでブロックします。
  4. オブジェクトの GetResult メソッドを 呼び出します。 このメソッドは、 シェル項目 オブジェクトと呼ばれる 2 つ目の COM オブジェクトへのポインターを返します。 IShellItem インターフェイスを実装する Shell 項目は、ユーザーが選択したファイルを表します。
  5. シェル アイテムの GetDisplayName メソッドを呼び出します。 このメソッドは、文字列の形式でファイル パスを取得します。
  6. ファイル パスを表示するメッセージ ボックスを表示します。
  7. CoUninitialize を呼び出して、COM ライブラリの初期化を解除します。

手順 1、2、および 7 では、COM ライブラリで定義されている関数を呼び出します。 これらは汎用 COM 関数です。 手順 3 から 5 では、共通項目ダイアログ オブジェクトで定義されているメソッドを呼び出します。

この例では、オブジェクトの作成のさまざまな種類を示します。ジェネリック CoCreateInstance 関数と、Common Item Dialog オブジェクトに固有のメソッド (GetResult) です。

次へ

オブジェクトの有効期間の管理

[開く] ダイアログ ボックスのサンプル