IWMMutualExclusion2
COM公式ドキュメント
IWMMutualExclusion2 インターフェイスは、相互排他オブジェクトに対する高度な構成機能を提供します。このインターフェイスは、複数言語と高度な相互排他の両方をサポートします。IWMMutualExclusion2 インターフェイスは、作成される相互排他オブジェクトごとに 1 つ作成されます。IWMMutualExclusion2 インターフェイスへのポインターを取得するには、IWMProfile::CreateNewMutualExclusion が返す IWMMutualExclusion インターフェイスの QueryInterface メソッドを呼び出します。
メソッド 10
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
GetName メソッドは、現在の相互排他オブジェクトの名前を取得します。相互排他オブジェクトに名前が付くのは、IWMMutualExclusion2::SetName メソッドを使用して名前が割り当てられている場合のみです。
| pwszName | LPWSTR | out | 相互排他オブジェクトの名前を格納するワイド文字の null 終端文字列へのポインター。名前の長さを取得するには NULL を渡します。 |
| pcchName | WORD* | inout | 入力時は、pwszName 配列の長さをワイド文字数(2 バイト)で格納する変数へのポインター。出力時は、メソッドが成功した場合、この変数に終端の null 文字を含む名前の長さが格納されます。 |
戻り値
このメソッドは HRESULT を返します。有効な値には、次の表に示すものが含まれますが、これらに限定されません。
| Return code | Description |
|---|---|
| メソッドは成功しました。 | |
| pcchName パラメーターが NULL です。 |
解説(Remarks)
pwszName に NULL を渡すことで、pcchName に名前の正しいサイズを取得し、その後、適切なサイズの文字列を指定してこのメソッドを再度呼び出すことができます。この場合、pcchName として渡す値は無関係です。この値は名前の正しい長さで置き換えられます。
pwszName としてアドレスを渡し、pcchName に指定した長さが名前の格納に必要な文字数より短い場合、GetName は pwszName を無視し、正しい文字数を pcchName に返します。この場合でも、メソッドは S_OK を返します。
SetName メソッドは、相互排他オブジェクトに名前を割り当てます。
| pwszName | LPWSTR | in | 割り当てる名前を格納するワイド文字の null 終端文字列へのポインター。 |
戻り値
このメソッドは HRESULT を返します。有効な値には、次の表に示すものが含まれますが、これらに限定されません。
| Return code | Description |
|---|---|
| メソッドは成功しました。 | |
| メソッドは名前を保持するメモリを割り当てられませんでした。 |
GetRecordCount メソッドは、相互排他オブジェクトに存在するレコードの数を取得します。
| pwRecordCount | WORD* | out | 相互排他オブジェクトに存在するレコードの数を格納する WORD へのポインター。 |
戻り値
このメソッドは HRESULT を返します。有効な値には、次の表に示すものが含まれますが、これらに限定されません。
| Return code | Description |
|---|---|
| メソッドは成功しました。 | |
| pwRecordCount パラメーターが NULL です。 |
解説(Remarks)
レコード番号は順番に割り当てられます。
AddRecord メソッドは、相互排他オブジェクトにレコードを追加します。
戻り値
このメソッドは HRESULT を返します。有効な値には、次の表に示すものが含まれますが、これらに限定されません。
| Return code | Description |
|---|---|
| メソッドは成功しました。 | |
| メソッドは新しいレコード用のメモリを割り当てられませんでした。 | |
| この相互排他オブジェクトのレコードのコレクションに新しいレコードを追加する際に問題が発生しました。 |
解説(Remarks)
他のメソッドで使用されるレコード番号は、レコードに順番に割り当てられます。
RemoveRecord メソッドは、相互排他オブジェクトからレコードを削除します。
| wRecordNumber | WORD | in | 削除するレコードの番号を格納する WORD。 |
戻り値
このメソッドは HRESULT を返します。有効な値には、次の表に示すものが含まれますが、これらに限定されません。
| Return code | Description |
|---|---|
| メソッドは成功しました。 | |
| wRecordNumber パラメーターに有効なレコード番号が含まれていません。 | |
| メソッドは、原因不明の理由でレコードにアクセスできません。 |
解説(Remarks)
レコードを削除すると、復元することはできません。
GetRecordName メソッドは、指定したレコードの名前を取得します。レコードに名前が付くのは、IWMMutualExclusion2::SetRecordName メソッドを使用して名前が割り当てられている場合のみです。
| wRecordNumber | WORD | in | 名前を取得するレコードの番号を格納する WORD。 |
| pwszRecordName | LPWSTR | out | レコード名を格納するワイド文字の null 終端文字列へのポインター。名前の長さを取得するには NULL を渡します。 |
| pcchRecordName | WORD* | inout | 入力時は、pwszRecordName 配列の長さをワイド文字数(2 バイト)で格納する変数へのポインター。出力時は、メソッドが成功した場合、この変数に終端の null 文字を含む名前の長さが格納されます。ただし、pwszRecordName として NULL を渡した場合、出力時にこの変数には必要な長さが設定されます。 |
戻り値
このメソッドは HRESULT を返します。有効な値には、次の表に示すものが含まれますが、これらに限定されません。
| Return code | Description |
|---|---|
| メソッドは成功しました。 | |
|
wRecordNumber に有効なレコード番号が含まれていません。
または pcchRecordName が NULL です。 |
|
| メソッドは、原因不明の理由でレコードにアクセスできません。 |
解説(Remarks)
取得するレコード名ごとに、GetRecordName を 2 回呼び出す必要があります。1 回目の呼び出しでは、pwszRecordName として NULL を渡します。戻り時に、pcchRecordName が指す値には、終端の null 文字を含めてレコード名の格納に必要なワイド文字数が設定されます。その後、文字列に必要な量のメモリを割り当て、2 回目の呼び出しでそのポインターを pwszRecordName として渡すことができます。
レコードには、作成された順に番号が順番に割り当てられます。
SetRecordName メソッドは、レコードに名前を割り当てます。後でレコードを容易に識別できるように、すべてのレコードに名前を割り当てる必要があります。
| wRecordNumber | WORD | in | 名前を割り当てるレコード番号を格納する WORD。 |
| pwszRecordName | LPWSTR | in | レコードに割り当てる名前を格納するワイド文字の null 終端文字列へのポインター。レコード名は 256 ワイド文字までに制限されます。 |
戻り値
このメソッドは HRESULT を返します。有効な値には、次の表に示すものが含まれますが、これらに限定されません。
| Return code | Description |
|---|---|
| メソッドは成功しました。 | |
| メソッドは名前用のメモリを割り当てられませんでした。 |
解説(Remarks)
pwszRecordName として空の文字列を渡した場合、メソッドは S_OK を返しますが、何も行われません。
GetStreamsForRecord メソッドは、レコードに存在するストリームのリストを取得します。
| wRecordNumber | WORD | in | ストリームを取得するレコード番号を格納する WORD。 |
| pwStreamNumArray | WORD* | out | ストリーム番号を受け取る配列へのポインター。NULL の場合、GetStreamsForRecord はストリーム数を pcStreams に返します。 |
| pcStreams | WORD* | inout | レコード内のストリーム数を格納する WORD へのポインター。 |
戻り値
このメソッドは HRESULT を返します。有効な値には、次の表に示すものが含まれますが、これらに限定されません。
| Return code | Description |
|---|---|
| メソッドは成功しました。 | |
|
pcStreams が NULL です。
または wRecordNumber に有効なレコード番号が含まれていません。 |
|
|
pcStreams として渡された値が、レコード内のストリーム数より小さいです。このエラーコードで終了する際、pcStreams の値には正しいストリーム数が格納されます。 |
| メソッドは、原因不明の理由でレコードにアクセスできません。 |
解説(Remarks)
GetStreamsForRecord は 2 回呼び出す必要があります。1 回目の呼び出しでは、pwStreamNumArray として NULL を渡します。戻り時に、pcStreams の値にストリーム数が設定されます。その後、配列の格納に必要な量のメモリを割り当て、2 回目の呼び出しでそのポインターを pwStreamNumArray として渡すことができます。
すべてのストリームを格納するのに十分な大きさでない配列を渡した場合、エラーコード ASF_E_BUFFERTOOSMALL が返されます。このエラーコードを返す際も、メソッドは pcStreams の値に正しいストリーム数を設定します。
AddStreamForRecord メソッドは、IWMMutualExclusion2::AddRecord で作成したレコードにストリームを追加します。
| wRecordNumber | WORD | in | ストリームを追加するレコードの番号を格納する WORD。 |
| wStreamNumber | WORD | in | 追加するストリーム番号を格納する WORD。 |
戻り値
このメソッドは HRESULT を返します。有効な値には、次の表に示すものが含まれますが、これらに限定されません。
| Return code | Description |
|---|---|
| メソッドは成功しました。 | |
| メソッドは新しいストリーム番号用のメモリを割り当てられません。 | |
| wRecordNumber に無効なレコード番号が含まれています。 | |
| メソッドは、原因不明の理由でレコードにアクセスできません。 |
解説(Remarks)
レコード番号は順番に割り当てられます。
RemoveStreamForRecord メソッドは、レコードのリストからストリームを削除します。
| wRecordNumber | WORD | in | ストリームを削除するレコード番号を格納する WORD。 |
| wStreamNumber | WORD | in | レコードから削除するストリーム番号を格納する WORD。 |
戻り値
このメソッドは HRESULT を返します。有効な値には、次の表に示すものが含まれますが、これらに限定されません。
| Return code | Description |
|---|---|
| メソッドは成功しました。 | |
| wStreamNumber で指定されたストリームが、wRecordNumber で指定されたレコードに存在しません。 | |
| wRecordNumber に有効なレコード番号が含まれていません。 | |
| メソッドは、原因不明の理由でレコードにアクセスできません。 |
解説(Remarks)
どちらの引数にも NULL を渡さないでください。例外エラーが発生します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IWMMutualExclusion2 "{0302B57D-89D1-4BA2-85C9-166F2C53EB91}" #usecom global IWMMutualExclusion2 IID_IWMMutualExclusion2 "{}" #comfunc global IWMMutualExclusion2_GetName 8 var,var #comfunc global IWMMutualExclusion2_SetName 9 wstr #comfunc global IWMMutualExclusion2_GetRecordCount 10 var #comfunc global IWMMutualExclusion2_AddRecord 11 #comfunc global IWMMutualExclusion2_RemoveRecord 12 int #comfunc global IWMMutualExclusion2_GetRecordName 13 int,var,var #comfunc global IWMMutualExclusion2_SetRecordName 14 int,wstr #comfunc global IWMMutualExclusion2_GetStreamsForRecord 15 int,var,var #comfunc global IWMMutualExclusion2_AddStreamForRecord 16 int,int #comfunc global IWMMutualExclusion2_RemoveStreamForRecord 17 int,int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_IWMMutualExclusion2 "{0302B57D-89D1-4BA2-85C9-166F2C53EB91}" #usecom global IWMMutualExclusion2 IID_IWMMutualExclusion2 "{}" #comfunc global IWMMutualExclusion2_GetName 8 sptr,sptr #comfunc global IWMMutualExclusion2_SetName 9 wstr #comfunc global IWMMutualExclusion2_GetRecordCount 10 sptr #comfunc global IWMMutualExclusion2_AddRecord 11 #comfunc global IWMMutualExclusion2_RemoveRecord 12 int #comfunc global IWMMutualExclusion2_GetRecordName 13 int,sptr,sptr #comfunc global IWMMutualExclusion2_SetRecordName 14 int,wstr #comfunc global IWMMutualExclusion2_GetStreamsForRecord 15 int,sptr,sptr #comfunc global IWMMutualExclusion2_AddStreamForRecord 16 int,int #comfunc global IWMMutualExclusion2_RemoveStreamForRecord 17 int,int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。