IDiscMaster
COM公式ドキュメント
IDiscMaster インターフェイスを使用すると、アプリケーションはイメージマスタリング API を予約し、イメージマスタリングオブジェクトがサポートするディスクマスタリング形式とディスクレコーダーを列挙し、ディスクへのシミュレーション書き込みまたは実際の書き込みを開始できます。
メソッド 12
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
クライアントアプリケーションからアクセスできるように、上位レベルの IMAPI オブジェクトを開きます。
戻り値
成功した場合は S_OK が返されますが、実装によっては他の成功コードが返される場合もあります。操作が失敗した場合は次のエラーコードが一般的に返されますが、返される可能性のあるエラー値はこれらに限りません。
この disc master オブジェクトがサポートするすべてのディスクマスタリング形式の列挙子を取得します。ディスクマスタリング形式は、ステージングされたイメージファイル内のコンテンツの構造 (データ/オーディオ) と、そのステージングイメージを管理するインターフェイスを指定します。
| ppEnum | IEnumDiscMasterFormats** | out | IEnumDiscMasterFormats 列挙子へのポインターのアドレス。 |
戻り値
成功した場合は S_OK が返されますが、実装によっては他の成功コードが返される場合もあります。操作が失敗した場合は次のエラーコードが一般的に返されますが、返される可能性のあるエラー値はこれらに限りません。
解説(Remarks)
MSDiscMasterObj は、サポートする形式をそのインターフェイス ID で識別する列挙子を返します。現在、形式は 2 つあります。IID_IRedbookDiscMaster ( IRedbookDiscMaster) と IID_IJolietDiscMaster ( IJolietDiscMaster) です。
IEnumDiscMasterFormats は、 IEnumXXXX に記載されているとおり、標準的な COM 列挙子です。Next を呼び出すたびに、サポートされるディスクマスタリング形式ごとに 1 つの IID を格納した IID の配列が返されます。アクティブな形式を選択し、その形式固有のインターフェイスへのポインターを取得するには、 SetActiveDiscMasterFormat を使用します (インターフェイスがアクティブな形式に関連付けられないため、QueryInterface は使用しないでください)。
アクティブなディスクレコーダー形式を取得します。アクティブな形式は、ステージングされたイメージファイルのコンテンツの構造 (オーディオ/データ) と、そのステージングイメージを操作するために使用する必要がある COM インターフェイスの両方を指定します。
| lpiid | GUID* | out | 現在アクティブな形式の IID。 |
戻り値
成功した場合は S_OK が返されますが、実装によっては他の成功コードが返される場合もあります。操作が失敗した場合は次のエラーコードが一般的に返されますが、返される可能性のあるエラー値はこれらに限りません。
解説(Remarks)
MSDiscMasterObj は、2 つの形式の IID をサポートします。IID_IRedbookDiscMaster (IRedbookDiscMaster) と IID_IJolietDiscMaster (IJolietDiscMaster) です。アクティブな形式を選択し、その形式固有のインターフェイスへのポインターを取得するには、 SetActiveDiscMasterFormat を使用します。
現在アクティブなディスクレコーダー形式を設定します。アクティブな形式は、ステージングされたイメージファイルのコンテンツの構造 (オーディオ/データ) と、そのステージングイメージを操作するために使用する必要がある COM インターフェイスの両方を指定します。
| riid | GUID* | in | 現在アクティブな形式の IID。 |
| ppUnk | void** | out | 新しいディスク形式に対応する COM インターフェイスへのポインター。 |
戻り値
成功した場合は S_OK が返されますが、実装によっては他の成功コードが返される場合もあります。操作が失敗した場合は次のエラーコードが一般的に返されますが、返される可能性のあるエラー値はこれらに限りません。
解説(Remarks)
このメソッドの呼び出しに成功すると、現在ステージングされているイメージの内容が消去されます。さらに、サポートされるディスクレコーダーの一覧が変化する場合があります。これは、すべてのレコーダーがすべての形式をサポートしているわけではないためです。レコーダー一覧の変更は IDiscMasterProgressEvents::NotifyPnPActivity によって通知されます。現在選択されているレコーダーが新しいサポート対象デバイスの集合に含まれていない場合、アクティブなレコーダーは存在しない状態になります ( Open を最初に呼び出した直後の状態と同様です)。この場合、アプリケーションは書き込みを開始する前に新しいアクティブレコーダーを選択する必要があります。
MSDiscMasterObj は、次の IID のみをサポートします。IID_IRedbookDiscMaster (IRedbookDiscMaster) と IID_IJolietDiscMaster (IJolietDiscMaster) です。形式が設定されていない場合、既定は Joliet 形式です。 EnumDiscMasterFormats とこのメソッドを使用して形式マスターを選択するのは、各アプリケーションの責任です。
アクティブなディスクマスタリング形式がサポートするすべてのディスクレコーダーの列挙子を取得します。
| ppEnum | IEnumDiscRecorders** | out | IEnumDiscRecorders 列挙子へのポインターのアドレス。 |
戻り値
成功した場合は S_OK が返されますが、実装によっては他の成功コードが返される場合もあります。操作が失敗した場合は次のエラーコードが一般的に返されますが、返される可能性のあるエラー値はこれらに限りません。
解説(Remarks)
IEnumDiscRecorders は、 IEnumXXXX に記載されているとおり、標準的な COM 列挙子です。Next を呼び出すたびに、 IDiscRecorder へのポインターの配列が返されます。各レコーダーインターフェイスは、基になる物理ディスクレコーダーに既に関連付けられた 1 つの利用可能なレコーダーを表します。
利用可能なレコーダーの一覧は、プラグアンドプレイによるデバイスの接続や取り外し、または SetActiveDiscMasterFormat の呼び出しによって変化する場合があります。アプリケーションは、 IDiscMasterProgressEvents::NotifyPnPActivity の呼び出しを受け取ることで、これらの変更を通知されます。各列挙子は列挙時点でサポートされていたデバイスのスナップショットを保持しているため、変更が発生した場合、アプリケーションはこのメソッドを再度呼び出して新しい列挙子を取得する必要があります。
デバイスが取り外された場合でも、基になる物理デバイスが存在しなくなったそのポインターと IDiscRecorder インターフェイスは有効なままである必要があります。この場合、 IDiscRecorder に対する操作やディスクへの記録要求は IMAPI_E_DEVICE_NOTPRESENT を返すことがあります。
MaxWriteSpeed プロパティは、このメソッドが呼び出されたときに更新されます。既定の設定は、利用可能な最も高い書き込み速度です。
アクティブなディスクレコーダーへのインターフェイスポインターを取得します。アクティブなディスクレコーダーとは、RecordDisc が呼び出されたときに書き込みが行われるレコーダーです。
| ppRecorder | IDiscRecorder** | out | 現在選択されているディスクレコーダーの IDiscRecorder インターフェイスへのポインター。 |
戻り値
成功した場合は S_OK が返されますが、実装によっては他の成功コードが返される場合もあります。操作が失敗した場合は次のエラーコードが一般的に返されますが、返される可能性のあるエラー値はこれらに限りません。
解説(Remarks)
既定のアクティブディスクレコーダーは存在しません。このメソッドを使用するアプリケーションは、書き込みを開始する前に、アクティブなマスタリング形式とアクティブなディスクレコーダーの両方を明示的に選択する必要があります。
アクティブなディスクレコーダーは、デバイスの取り外しやアクティブなディスクマスタリング形式の変更によって無効になることがあります。たとえば、アプリケーションの実行中に USB CD-R デバイスがコンピューターから切断される場合があります (アプリケーションは IDiscMasterProgressEvents::NotifyPnPActivity の呼び出しによってこの状態を通知されます)。いずれの場合も、新しいアクティブディスクレコーダーを選択する必要があります。
アクティブなディスクレコーダーを選択します。アクティブなディスクレコーダーとは、RecordDisc が呼び出されたときに書き込みが行われるレコーダーです。
| pRecorder | IDiscRecorder* | inoptional | ディスクレコーダーオブジェクトの IDiscRecorder インターフェイスへのポインター。このポインターは、事前の EnumDiscRecorders の呼び出しによって返されたものである必要があります。 |
戻り値
成功した場合は S_OK が返されますが、実装によっては他の成功コードが返される場合もあります。操作が失敗した場合は次のエラーコードが一般的に返されますが、返される可能性のあるエラー値はこれらに限りません。
解説(Remarks)
SetActiveDiscRecorder は、使用するメディアを挿入した後、かつ IJolietDiscMaster::AddData を呼び出す前に呼び出す必要があります。
Joliet 形式がアクティブな状態でレコーダーを選択すると、IMAPI は現在挿入されているレコーダー内のディスクから情報を読み取ります。そのディスクが以前に IMAPI で作成された Joliet ディスクであり、別のセッションを追加する空き領域がある場合、IMAPI は自動的にマルチセッションモードに設定されます。 RecordDisc を呼び出す際には、このディスクがアクティブなレコーダーに入っている必要があります。
MaxWriteSpeed プロパティは、このメソッドが呼び出されたときに更新されます。既定の設定は、最も高い書き込み速度です。
未書き込みのイメージ (現在のスタッシュファイル) の内容を消去します。
戻り値
成功した場合は S_OK が返されますが、実装によっては他の成功コードが返される場合もあります。操作が失敗した場合は次のエラーコードが一般的に返されますが、返される可能性のあるエラー値はこれらに限りません。
解説(Remarks)
スタッシュファイルは、メディアに記録する前にディスクをステージングするために使用される内部構造です。
SetActiveDiscRecorder は、アクティブなドライブに IMAPI のマルチセッションディスクが入っているかどうかを判定します。入っている場合、IMAPI は自動的にマルチセッションモードに入ります。マルチセッションモードが確立された後に ClearFormatContent を使用すると、IMAPI はシングルセッションモードに戻ります。つまり、 RecordDisc による書き込みには空のディスクが必要になります。
進行状況通知を受け取るためにアプリケーションを登録します。
| pEvents | IDiscMasterProgressEvents* | inoptional | 進行状況通知を受け取る IDiscMasterProgressEvents インターフェイスへのポインター。 |
| pvCookie | UINT_PTR* | out | この登録を一意に識別します。この値は ProgressUnadvise メソッドで必要になるため、保存しておいてください。 |
戻り値
成功した場合は S_OK が返されますが、実装によっては他の成功コードが返される場合もあります。操作が失敗した場合は次のエラーコードが一般的に返されますが、返される可能性のあるエラー値はこれらに限りません。
アプリケーションに対する進行状況通知を解除します。
| vCookie | UINT_PTR | in | 事前の ProgressAdvise メソッドの呼び出しによって返された値。 |
戻り値
成功した場合は S_OK が返されますが、実装によっては他の成功コードが返される場合もあります。操作が失敗した場合は次のエラーコードが一般的に返されますが、返される可能性のあるエラー値はこれらに限りません。
ステージングされたイメージを、アクティブなディスクレコーダー内のメディアに書き込みます。
| bSimulate | BYTE | in | メディアに実際に書き込むかどうかを示します。このパラメーターが TRUE の場合、アクティブなディスクレコーダー内のメディアには実際には書き込まれず、代わりにシミュレーション書き込みが実行されます。シミュレーションでは実際の書き込みとほぼ同じ処理が実行されるため、ディスクレコーダーの良好なテストになります。このパラメーターが FALSE の場合、レコーダー内のメディアに実際に書き込まれます。 |
| bEjectAfterBurn | BYTE | in | 書き込み後にメディアを取り出すかどうかを示します。このパラメーターが TRUE の場合、メディアは取り出されます。FALSE の場合、メディアは取り出されません。 |
戻り値
成功した場合は S_OK が返されますが、実装によっては他の成功コードが返される場合もあります。操作が失敗した場合は次のエラーコードが一般的に返されますが、返される可能性のあるエラー値はこれらに限りません。
解説(Remarks)
このメソッドは書き込みが完了したときに戻りますが、 ProgressAdvise メソッドで登録されている場合は進行状況のコールバックが行われます。エラーが発生するとこのメソッドは戻り、このメソッド側での修復処理はほとんど、あるいはまったく行われません。
ステージングされたイメージデータは、 RecordDisc の呼び出し後は無効になります。これにより、アプリケーションはメディアへのシミュレーション書き込みまたは実際の書き込みのいずれかを実行できます。セキュリティ上の理由から、このメソッドの最初の呼び出しが正常に完了すると、スタッシュファイルの内容は自動的に消去されます。再度書き込むには、ディスクを再度ステージングする必要があります。
RecordDisc メソッドは、オーディオの場合は空のメディアを対象として動作することを前提としています。それ以外の場合は、メディアの消去が必要になることがあります (たとえば、CD-RW ドライブ内の CD-RW メディアなど)。 IDiscRecorder::Erase を参照してください。
SetActiveDiscRecorder メソッドは、設定時にアクティブなドライブに IMAPI のマルチセッションディスクが入っているかどうかを判定します。入っている場合、IMAPI は自動的にマルチセッションモードに入ります。マルチセッションモードの状態で RecordDisc を呼び出す場合、マルチセッションモードを確立したのと同じディスクがアクティブなレコーダーに入っている必要があります。入っていない場合は、エラーコード IMAPI_E_WRONGDISC が返されます。
他のアプリケーションが使用できるように、インターフェイスを閉じます。
戻り値
成功した場合は S_OK が返されますが、実装によっては他の成功コードが返される場合もあります。
解説(Remarks)
RecordDisc の呼び出しによってメディアに確定されていないコンテンツは失われます。
既に閉じられているインターフェイスを閉じた場合は S_OK が返されます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IDiscMaster "{520CCA62-51A5-11D3-9144-00104BA11C5E}" #usecom global IDiscMaster IID_IDiscMaster "{}" #comfunc global IDiscMaster_Open 3 #comfunc global IDiscMaster_EnumDiscMasterFormats 4 sptr #comfunc global IDiscMaster_GetActiveDiscMasterFormat 5 var #comfunc global IDiscMaster_SetActiveDiscMasterFormat 6 var,sptr #comfunc global IDiscMaster_EnumDiscRecorders 7 sptr #comfunc global IDiscMaster_GetActiveDiscRecorder 8 sptr #comfunc global IDiscMaster_SetActiveDiscRecorder 9 sptr #comfunc global IDiscMaster_ClearFormatContent 10 #comfunc global IDiscMaster_ProgressAdvise 11 sptr,var #comfunc global IDiscMaster_ProgressUnadvise 12 sptr #comfunc global IDiscMaster_RecordDisc 13 int,int #comfunc global IDiscMaster_Close 14 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IDiscMaster "{520CCA62-51A5-11D3-9144-00104BA11C5E}" #usecom global IDiscMaster IID_IDiscMaster "{}" #comfunc global IDiscMaster_Open 3 #comfunc global IDiscMaster_EnumDiscMasterFormats 4 sptr #comfunc global IDiscMaster_GetActiveDiscMasterFormat 5 sptr #comfunc global IDiscMaster_SetActiveDiscMasterFormat 6 sptr,sptr #comfunc global IDiscMaster_EnumDiscRecorders 7 sptr #comfunc global IDiscMaster_GetActiveDiscRecorder 8 sptr #comfunc global IDiscMaster_SetActiveDiscRecorder 9 sptr #comfunc global IDiscMaster_ClearFormatContent 10 #comfunc global IDiscMaster_ProgressAdvise 11 sptr,sptr #comfunc global IDiscMaster_ProgressUnadvise 12 sptr #comfunc global IDiscMaster_RecordDisc 13 int,int #comfunc global IDiscMaster_Close 14 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。