Platform SDK: DirectX

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

[C++]

リソースから、またはメモリの別の場所からオブジェクトをロードする操作は、ファイルからオブジェクトをロードする場合とほぼ同じである (「ファイルからのオブジェクトのロード」を参照すること)。ただし、この場合、DMUS_OBJECTDESC 構造体の wszNameguidObject、および wszFileName メンバは使用しない。これらのメンバの代わりに、オブジェクトが占有しているメモリ ブロックへのポインタと、そのサイズを取得し、これらの情報をそれぞれ、DMUS_OBJECTDESC 構造体の pbMemData および llMemLength メンバに格納する。dwFlags メンバの DMUS_OBJ_MEMORY フラグも設定しなければならない。

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

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

HRESULT LoadMidi(HMODULE hMod, WORD ResourceID)
{
    HRESULT              hr;
    DMUS_OBJECTDESC      ObjDesc;
    IDirectMusicSegment* pSegment = NULL; 
 
    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_pDXPerformance->m_pLoader->GetObject(
            &ObjDesc, IID_IDirectMusicSegment2, 
            (void**) &m_pSegment );
 
    return hr;
}

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


[Visual Basic]

リソースから、またはメモリの別の場所からオブジェクトをロードする操作は、ファイルからオブジェクトをロードする場合とほぼ同じである (「ファイルからのオブジェクトのロード」を参照すること)。DirectMusicLoader.LoadBandFromResourceDirectMusicLoader.LoadChordMapFromResourceDirectMusicLoader.LoadCollectionFromResourceDirectMusicLoader.LoadSegmentFromResource、および DirectMusicLoader.LoadStyleFromResource メソッドはそれぞれ、モジュール名とリソース識別子をパラメータとして受け取り、適切なクラスのインスタンスを返す。

ローダーでは、次の種類のリソースが認識される。

"DMBAND" LoadBandFromResource
"DMCHORD" LoadChordmapFromResource
"DMCOLL" LoadCollectionFromResource
"DMSEG" LoadSegmentFromResource
"DMSTYLE" LoadStyleFromResource

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

次のコード例では、実行可能ファイルに "DMSEG" リソースとして格納されている MIDI ファイルを、ロードおよび演奏する。loaderDirectMusicLoader オブジェクトを表し、perfDirectMusicPerformance を表す。

Dim seg As DirectMusicSegment
Set seg = loader.LoadSegmentFromResource("listen.exe", "CANYON.MID")
Call seg.Download(perf)
Call perf.PlaySegment(SEG, 0, 0)