Microsoft DirectX 8.0 (C++)

コンテナ

コンテナは、さまざまなオブジェクトを含むファイルを表すオブジェクトである。コンテナ ファイルには、セグメント、スタイル、DLS コレクションなど、パフォーマンスに必要なすべてのデータが保持される場合がある。コンテナ ファイルは、通常、DirectMusic Producer で作成される。コンテナはセグメント ファイルおよびスクリプト ファイル内にも作成できる。

コンテナは、IDirectMusicLoader8::GetObject を使用して、ほかのオブジェクトと同様にロードする。このメソッドは、コンテナ内のすべてのオブジェクトをローダーに知らせ、GetObject を使って名前または GUID でオブジェクトを取得できるようにする。

IDirectMusicContainer8 インターフェイスを取得した後は、IDirectMusicContainer8::EnumObject を使ってコンテナ内のオブジェクトを列挙できる。

次のサンプル関数は、コンテナをロードし、名前によってコンテナからセグメントを取得し、IDirectMusicSegment インターフェイスを返す。実際の例を示すため、コンテナ オブジェクトは関数内で作成および解放される。オブジェクトの複製を避けるため、この処理はアプリケーション内で一度しか実行できない。

IDirectMusicSegment* LoadSegmentFromContainer (
        IDirectMusicLoader8* pLoader, 
        WCHAR* wszFileName, 
        WCHAR* wszSegmentName )
 
{
  DMUS_OBJECTDESC ObjDesc; 
  IDirectMusicSegment* pSegment = NULL;
  IDirectMusicContainer8* pContainer = NULL;

// コンテナのロード。
 
  HRESULT hr = pLoader->LoadObjectFromFile(CLSID_DirectMusicContainer,
      IID_IDirectMusicContainer8, wszFileName, (void**)&pContainer);
  if (FAILED(hr)) 
        return NULL;
 
// セグメントを記述する。
 
  ZeroMemory(&objDesc, sizeof(objDesc));
  objDesc.dwSize = sizeof(objDesc);
  objDesc.dwValidData = DMUS_OBJ_CLASS | DMUS_OBJ_NAME;
  objDesc.guidClass = CLSID_DirectMusicSegment;
  wcsncpy (objDesc.wszName, wszSegmentName, 
      sizeof(objDesc.wszName) - 1);
  objDesc.wszName[sizeof(objDesc.wszName) - 1] = 0;
 
// セグメントのロード。
 
  hr = pLoader->GetObject(&ObjDesc, IID_IDirectMusicSegment, 
      (void**) &pSegment);
 
// コンテナをキャッシュから解放し、オブジェクトを破棄する。

  if (pContainer)
  {  
    IDirectMusicObject *pObject = NULL;
    pContainer->QueryInterface(IID_IDirectMusicObject,
            (void **)&pObject);
    if (pObject)
    {
      pLoader->ReleaseObject(pObject);
      pObject->Release();
    }
  pContainer->Release();
  }
  if (S_OK != hr) return NULL;
  return pSegment;
}