Microsoft DirectX 8.0 (C++)

オブジェクトの設定

後でほかのオブジェクトから参照されるオブジェクトを、参照元のオブジェクトをロードするときにローダーが取得できるように、実際にはロードせずに、その場所だけをローダーに指示することが望ましい。オブジェクトに新しい属性を与えて、ローダーが属性を使ってオブジェクトを検索できるようにすることもできる。

IDirectMusicLoader8::SetObject メソッドは、パラメータとして DMUS_OBJECTDESC 構造体を受け取る。この構造体には、2 つの主要な情報が含まれる。

戻り値として、DMUS_OBJECTDESC 構造体に、ローダーによって収集されたオブジェクトに関する追加情報が保持される場合がある。

次の関数では、リソース内の名前の付いていないオブジェクト (MIDI ファイルなど) に名前を割り当てている。

// m_pLoader は有効な IDirectMusicLoader8 インターフェイス ポインタである。
 
HRESULT SetObjectFromResource(const GUID* guid, int ID,
        char* type, WCHAR* name)
{
  HRSRC hResource = NULL;
  HGLOBAL hData = NULL;
  hResource = FindResource(g_hInstance, MAKEINTRESOURCE(ID), type);
  if (hResource != NULL)
  {
    hData = LoadResource(g_hInstance, hResource); 
    if (hData != NULL)
    {
      DMUS_OBJECTDESC desc;
      if(m_pLoader && (hResource != NULL) && (hData != NULL))
      {
        ZeroMemory(&desc,sizeof(desc));
        desc.pbMemData = (BYTE*) LockResource(*hData);
        desc.llMemLength = SizeofResource(g_hInstance, (*hResource));
        desc.guidClass = (*guid);
        desc.dwSize = sizeof(desc);
        desc.dwValidData = DMUS_OBJ_CLASS | DMUS_OBJ_MEMORY;
        if (name)
        {
            wcscpy(desc.wszName, name);
            desc.dwValidData |= DMUS_OBJ_NAME;
        }
        return m_pLoader->SetObject(&desc);
      }
    }
  }
  return E_FAIL;
}

次のサンプル関数は、"MIDI" タイプのリソースとして格納された MIDI ファイルに名前を割り当てるときに使用できる。

SetObjectFromResource(CLSID_DirectMusicSegment, 101,
        "MIDI", "canyon");

これ以降、オブジェクトはいつでも名前を使ってロードできる。