Platform SDK: DirectX |
リソースから、またはメモリの別の場所からオブジェクトをロードする操作は、ファイルからオブジェクトをロードする場合とほぼ同じである (「ファイルからのオブジェクトのロード」を参照すること)。ただし、この場合、DMUS_OBJECTDESC 構造体の wszName、guidObject、および 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 を呼び出すこともできる。
リソースから、またはメモリの別の場所からオブジェクトをロードする操作は、ファイルからオブジェクトをロードする場合とほぼ同じである (「ファイルからのオブジェクトのロード」を参照すること)。DirectMusicLoader.LoadBandFromResource、DirectMusicLoader.LoadChordMapFromResource、DirectMusicLoader.LoadCollectionFromResource、DirectMusicLoader.LoadSegmentFromResource、および DirectMusicLoader.LoadStyleFromResource メソッドはそれぞれ、モジュール名とリソース識別子をパラメータとして受け取り、適切なクラスのインスタンスを返す。
ローダーでは、次の種類のリソースが認識される。
"DMBAND" | LoadBandFromResource |
"DMCHORD" | LoadChordmapFromResource |
"DMCOLL" | LoadCollectionFromResource |
"DMSEG" | LoadSegmentFromResource |
"DMSTYLE" | LoadStyleFromResource |
ほかのオブジェクトによって参照されているオブジェクトは、最初にロードしなければならない。たとえば、スタイルへの参照を含むセグメントをロードする場合、セグメントを正しく演奏するには、スタイルが先にロードされていなければならない。
次のコード例では、実行可能ファイルに "DMSEG" リソースとして格納されている MIDI ファイルを、ロードおよび演奏する。loader は DirectMusicLoader オブジェクトを表し、perf は DirectMusicPerformance を表す。
Dim seg As DirectMusicSegment Set seg = loader.LoadSegmentFromResource("listen.exe", "CANYON.MID") Call seg.Download(perf) Call perf.PlaySegment(SEG, 0, 0)