Microsoft DirectX 8.0 (C++)

リソースからのオブジェクトのロード

リソースとして格納されたオブジェクトまたはメモリ内の別の場所に格納されたオブジェクトは、ファイル オブジェクトと同様にロードされる。「ファイルからのオブジェクトのロード」を参照すること。

ただし、メモリ オブジェクトの場合、DMUS_OBJECTDESC 構造体の wszNameguidObject、および wszFileName メンバは使用しない。これらのメンバの代わりに、オブジェクトが占有しているメモリ ブロックへのポインタと、そのサイズを取得し、これらの情報をそれぞれ pbMemData および llMemLength メンバに格納する。dwFlags メンバの DMUS_OBJ_MEMORY フラグも設定しなければならない。

データを簡単にキャッシングできるように、ローダーはメモリへの内部ポインタを保持するため、一度 IDirectMusicLoader8::GetObject が呼び出されると、メモリを解放することはできない。これを消去するには、IDirectMusicLoader8::SetObject を同じ DMUS_OBJECTDESC ディスクリプタを使って呼び出す。ただし、pbMemData には NULL を設定する。リソース メモリは解放されないため、リソースからロードする場合は関係ない。

次の関数では、MIDI ファイルをリソースからセグメントにロードしている。

// m_pLoader は有効な IDirectMusicLoader8 ポインタである。
 
IDirectMusicSegment8* m_pSegment; 
 
HRESULT LoadMidi(HMODULE hMod, WORD ResourceID)
{
    HRESULT              hr;
    DMUS_OBJECTDESC      ObjDesc;
 
    HRSRC hFound = FindResource(hMod, 
            MAKEINTRESOURCE(ResourceID), RT_RCDATA);
    HGLOBAL hRes = LoadResource(hMod, hFound);
 
    ObjDesc.dwSize = sizeof(DMUS_OBJECTDESC);
    ObjDesc.guidClass = CLSID_DirectMusicSegment;
    ObjDesc.dwValidData = DMUS_OBJ_CLASS | DMUS_OBJ_MEMORY;
    ObjDesc.pbMemData = (BYTE *) LockResource(hRes);
    ObjDesc.llMemLength = SizeofResource(hMod, hFound);
 
    hr = m_pLoader->GetObject(
            &ObjDesc, IID_IDirectMusicSegment8, 
            (void**) &m_pSegment );
 
    return hr;
}

ほかのオブジェクトによって参照されているオブジェクトは、最初にロードしなければならない。たとえば、スタイルへの参照を含むセグメントをロードする場合、セグメントを正しく演奏するには、スタイルが先にロードされていなければならない。セグメントがスタイルを見つけられるように、スタイルで IDirectMusicLoader8::SetObject を呼び出すこともできる。