Platform SDK: DirectX

オブジェクトの列挙

[Visual Basic]

ここでは、C++ で記述されたアプリケーションに関連のある内容だけを説明する。

[C++]

IDirectMusicLoader::EnumObject メソッドを使って、IDirectMusicLoader::ScanDirectory または IDirectMusicLoader::GetObject のどちらかを呼び出して内部データベースに記録した、特定のクラスまたは全クラスの全オブジェクトを反復する。見つかった各オブジェクトの説明は、DMUS_OBJECTDESC 構造体に返される。

 :  全オブジェクトを確実に見つけるには、最初に ScanDirectory を呼び出しておく。EnumObject はディスク ファイルを解析するのではなく、内部データベースでオブジェクトをチェックする。

次の例では、現在の検索ディレクトリに記録されているすべてのスタイル オブジェクトを列挙し、デバッギング マクロ TRACE を使ってそれらの情報を 1 つずつ表示している。そのクラスで列挙すべきオブジェクトがなくなるまでループは続行される。

void myListStyles(
        IDirectMusicLoader *pILoader)
 
{
    HRESULT hr = pILoader->SetSearchDirectory(
            CLSID_DirectMusicStyle,
            L"c:\\mymusic\\wassup",
            TRUE);
    if (SUCCEEDED(hr))
    {
        hr = pILoader->ScanDirectory(
                CLSID_DirectMusicStyle,
                L"sty",
                L"stylecache");
        if (hr == S_OK)    // ファイルが見つかった場合のみ...
        {
            DWORD dwIndex;
            DMUS_OBJECTDESC Desc;
            Desc.dwSize = sizeof(DMUS_OBJECTDESC);
            for (dwIndex = 0; ;dwIndex++)
            {
                if (S_OK ==(pILoader->EnumObject(
                        CLSID_DirectMusicStyle,
                        dwIndex, &Desc)))
                {
                    TRACE("Name: %S, Category: %S, Path: %S\n",
                            Desc.wszName,
                            Desc.wszCategory,
                            Desc.wszFileName);
                }
                else break;
            }
        }
    }
}

このコード例では、メソッド呼び出しの結果をテストする目的で、SUCCEEDED マクロを使っていない点に注意すること。不適切なインデックス番号を指定した場合、EnumObject が成功コードの S_FALSE を返すためである。