IUPnPRegistrar
COM公式ドキュメント
IUPnPRegistrar インターフェイスは、デバイスホストのコンテキストで実行されるデバイスを登録します。
メソッド 6
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
RegisterDevice メソッドは、デバイスをデバイスホストに登録します。デバイス情報はデバイスホストによって格納されます。その後、デバイスホストはデバイス識別子を返し、ネットワーク上でデバイスを公開してアナウンスします。
| bstrXMLDesc | LPWSTR | in | 登録するデバイスの XML デバイス記述テンプレートを指定します。 |
| bstrProgIDDeviceControlClass | LPWSTR | in | IUPnPDeviceControl インターフェイスを実装するデバイス制御オブジェクトの ProgID を指定します。このインターフェイスはインプロセス COM サーバー (CLSCTX_INPROC_SERVER) である必要があり、LocalService からアクセス可能である必要があります。 |
| bstrInitString | LPWSTR | in | デバイス固有の初期化文字列を指定します。この文字列は後で IUPnPDeviceControl::Initialize に渡されます。 |
| bstrContainerId | LPWSTR | in | デバイスが属するプロセスグループを識別する文字列を指定します。同じコンテナー ID を持つすべてのデバイスは、同じプロセス内に格納されます。 |
| bstrResourcePath | LPWSTR | in | デバイスのリソースディレクトリの場所を指定します。このリソースディレクトリには、デバイス記述テンプレート bstrXMLDesc で指定されたアイコンファイルとサービス記述が含まれます。リソースディレクトリにはプレゼンテーションファイルを含めることもできますが、これは省略可能です。 |
| nLifeTime | INT | in | デバイスアナウンスの有効期間を秒単位で指定します。タイムアウトが経過すると、アナウンスは更新されます。ゼロを指定した場合は、既定値の 1800 (30 分) が使用されます。指定できる最小値は 900 (15 分) で、900 未満の値を指定するとエラーが返されます。 |
| pbstrDeviceIdentifier | LPWSTR* | out | デバイス識別子を受け取ります。デバイスの登録解除または再登録の際にこの識別子を使用します。このデバイス ID は保存してください。 UnregisterDevice を呼び出す際に必要になります。 |
戻り値
メソッドが成功した場合、戻り値は S_OK です。それ以外の場合、メソッドは WinError.h で定義されている COM エラーコードのいずれか、または次の UPnP 固有のエラーコードのいずれかを返します。
| 戻り値 | 説明 |
|---|---|
| 同一の親デバイス内のサービスに、重複したサービス ID が存在します。 | |
| デバイス記述が有効ではありません。 | |
| デバイス記述の icon 要素にエラーがあります。 | |
| デバイス記述の service 要素にエラーがあります。 | |
| 必須要素が不足しています。 |
解説(Remarks)
制御要求またはイベント要求を受信すると、デバイスがインスタンス化され、 IUPnPDeviceControl::Initialize が呼び出されます。
UnregisterDevice または IUPnPReregistrar::ReregisterDevice を呼び出す際には、pbstrDeviceIdentifier で返された識別子を使用してください。
この関数の呼び出し時に発生する一般的なエラーには、次のようなものがあります。
- 必要な COM オブジェクトが見つからなかった。
- LocalService から COM オブジェクトにアクセスできない。
- 下位の COM インターフェイスに関する問題。
- XML 記述の制限 ( デバイス記述の作成 を参照)。
- イベント対象の変数が成功コードを返さず、デバイスがシャットダウンされた。
- サービス記述が無効だった。validatesd.exe を使用して、サービス記述が有効であることを確認してください。
- サービスが IUPnPEventSource を実装しておらず、 IUPnPEventSource::Advise に成功コードを返さなかったため、デバイスがシャットダウンされた。
RegisterRunningDevice メソッドは、実行中のデバイスをデバイスホストに登録します。
| bstrXMLDesc | LPWSTR | in | 登録するデバイスの XML デバイス記述テンプレートを指定します。 |
| punkDeviceControl | IUnknown* | in | デバイスのデバイス制御オブジェクトへの IUnknown ポインターを指定します。 |
| bstrInitString | LPWSTR | in | デバイス固有の初期化文字列を指定します。この文字列は後で IUPnPDeviceControl::Initialize に渡されます。 |
| bstrResourcePath | LPWSTR | in | デバイスのリソースディレクトリの場所を指定します。このリソースディレクトリには、デバイス記述テンプレート bstrXMLDesc で指定されたアイコンファイルとサービス記述が含まれます。 |
| nLifeTime | INT | in | デバイスアナウンスの有効期間を秒単位で指定します。タイムアウトが経過すると、アナウンスは更新されます。ゼロを指定した場合は、既定値の 1800 (30 分) が使用されます。指定できる最小値は 900 (15 分) で、900 未満の値を指定するとエラーが返されます。 |
| pbstrDeviceIdentifier | LPWSTR* | out | デバイス識別子を受け取ります。デバイスの登録解除または再登録の際にこの識別子を使用します。このデバイス ID は保存してください。 UnregisterDevice を呼び出す際に必要になります。 |
戻り値
メソッドが成功した場合、戻り値は S_OK です。それ以外の場合、メソッドは WinError.h で定義されている COM エラーコードのいずれか、または次の UPnP 固有のエラーコードのいずれかを返します。
| 戻り値 | 説明 |
|---|---|
| 重複した要素が存在します。 | |
| 同一の親デバイス内のサービスに、重複したサービス ID が存在します。 | |
| デバイス記述が有効ではありません。 | |
| デバイス記述の icon 要素にエラーがあります。 | |
| デバイス記述の service 要素にエラーがあります。 | |
| 必須要素が不足しています。 |
解説(Remarks)
このメソッドを呼び出すクライアントは、処理を完了するために LocalService を偽装 (impersonate) できる必要があります。
最初の制御要求またはイベント要求を受信すると、 IUPnPDeviceControl::Initialize メソッドが呼び出されます。
UnregisterDevice または IUPnPReregistrar::ReregisterRunningDevice を呼び出す際には、pbstrDeviceIdentifier で返された識別子を使用してください。
このデバイスの登録は、システムの再起動をまたいで保持されません。
この関数の呼び出し時に発生する一般的なエラーには、次のようなものがあります。
- 必要な COM オブジェクトが見つからなかった。
- LocalService から COM オブジェクトにアクセスできない。
- 下位の COM インターフェイスに関する問題。
- XML 記述の制限 ( デバイス記述の作成 を参照)。
- イベント対象の変数が成功コードを返さず、デバイスがシャットダウンされた。
- サービス記述が無効だった。validatesd.exe を使用して、サービス記述が有効であることを確認してください。
- サービスが IUPnPEventSource を実装しておらず、 IUPnPEventSource::Advise に成功コードを返さなかったため、デバイスがシャットダウンされた。
RegisterDeviceProvider メソッドは、デバイスプロバイダーをデバイスホストに登録します。デバイスプロバイダー自体はネットワーク上に公開されません。代わりに、デバイスプロバイダーは動的にデバイスを作成し、RegisterRunningDevice を使用してそれらを登録します。
| bstrProviderName | LPWSTR | in | デバイスプロバイダーの名前を指定します。 |
| bstrProgIDProviderClass | LPWSTR | in | IUPnPDeviceProvider インターフェイスを実装するオブジェクトの ProgID を指定します。このオブジェクトはあらかじめ COM に登録されている必要があります。また、インプロセス COM サーバー (CLSCTX_INPROC_SERVER) である必要があり、LocalService からアクセス可能である必要があります。 |
| bstrInitString | LPWSTR | in | デバイスプロバイダー固有の初期化文字列を指定します。 |
| bstrContainerId | LPWSTR | in | デバイスプロバイダーが属するプロセスグループを識別する文字列を指定します。同じコンテナー ID を持つすべてのデバイスおよびデバイスプロバイダーは、同じプロセス内に格納されます。 |
戻り値
メソッドが成功した場合、戻り値は S_OK です。それ以外の場合、メソッドは WinError.h で定義されている COM エラーコードのいずれかを返します。
解説(Remarks)
この関数の呼び出し時に発生する一般的なエラーには、次のようなものがあります。
- 必要な COM オブジェクトが見つからなかった。
- LocalService から COM オブジェクトにアクセスできない。
- 下位の COM インターフェイスに関する問題。
GetUniqueDeviceName メソッドは、指定されたデバイスの UDN を取得します。
| bstrDeviceIdentifier | LPWSTR | in | RegisterDevice または RegisterRunningDevice から返された識別子を指定します。 |
| bstrTemplateUDN | LPWSTR | in | デバイス記述テンプレート内の UDN を指定します。 |
| pbstrUDN | LPWSTR* | out | デバイスホストによって生成された、デバイスの UDN を受け取ります。 |
戻り値
メソッドが成功した場合、戻り値は S_OK です。それ以外の場合、メソッドは WinError.h で定義されている COM エラーコードのいずれかを返します。
解説(Remarks)
デバイス記述テンプレート内でデバイスに指定された各 UDN は、登録時に置き換えられます。デバイスホストは、各 UDN をグローバルに一意な値に置き換えます。
UnregisterDevice メソッドは、デバイスホストからデバイスの登録を解除します。デバイスの登録解除は、一時的または恒久的のいずれかで行われます。
| bstrDeviceIdentifier | LPWSTR | in | 登録を解除するデバイスのデバイス識別子を指定します。このデバイス識別子は、 RegisterDevice または RegisterRunningDevice の以前の呼び出しで返されたものです。 |
| fPermanent | BOOL | in | デバイスの登録を恒久的に解除するか一時的に解除するかを指定します。デバイスホストからデバイスの登録を恒久的に解除するには TRUE を指定します。一時的に解除するには FALSE を指定します。 |
戻り値
メソッドが成功した場合、戻り値は S_OK です。それ以外の場合、メソッドは WinError.h で定義されている COM エラーコードのいずれかを返します。
解説(Remarks)
このメソッドは、デバイスホストからデバイスを削除します。fPermanent が TRUE の場合、デバイスの登録は恒久的に解除されます。それ以外の場合、デバイス識別子 ( RegisterDevice または RegisterRunningDevice から返された値) とデバイスホストが生成した UDN とのマッピングは、デバイスホスト内に保持されます。デバイスの登録を一時的に解除した場合、そのデバイスを再登録するときには、以前にデバイスに関連付けられていた UDN を使用します。
UnregisterDeviceProvider メソッドは、デバイスホストからデバイスプロバイダーの登録を恒久的に解除し、アンロードします。IUPnPDeviceProvider::Stop メソッドが呼び出されます。
| bstrProviderName | LPWSTR | in | プロバイダー名を指定します。 RegisterDeviceProvider の呼び出しで使用したものと同じ名前を使用してください。 |
戻り値
メソッドが成功した場合、戻り値は S_OK です。それ以外の場合、メソッドは WinError.h で定義されている COM エラーコードのいずれかを返します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IUPnPRegistrar "{204810B6-73B2-11D4-BF42-00B0D0118B56}" #usecom global IUPnPRegistrar IID_IUPnPRegistrar "{204810B9-73B2-11D4-BF42-00B0D0118B56}" #comfunc global IUPnPRegistrar_RegisterDevice 3 wstr,wstr,wstr,wstr,wstr,int,var #comfunc global IUPnPRegistrar_RegisterRunningDevice 4 wstr,sptr,wstr,wstr,int,var #comfunc global IUPnPRegistrar_RegisterDeviceProvider 5 wstr,wstr,wstr,wstr #comfunc global IUPnPRegistrar_GetUniqueDeviceName 6 wstr,wstr,var #comfunc global IUPnPRegistrar_UnregisterDevice 7 wstr,int #comfunc global IUPnPRegistrar_UnregisterDeviceProvider 8 wstr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IUPnPRegistrar "{204810B6-73B2-11D4-BF42-00B0D0118B56}" #usecom global IUPnPRegistrar IID_IUPnPRegistrar "{204810B9-73B2-11D4-BF42-00B0D0118B56}" #comfunc global IUPnPRegistrar_RegisterDevice 3 wstr,wstr,wstr,wstr,wstr,int,sptr #comfunc global IUPnPRegistrar_RegisterRunningDevice 4 wstr,sptr,wstr,wstr,int,sptr #comfunc global IUPnPRegistrar_RegisterDeviceProvider 5 wstr,wstr,wstr,wstr #comfunc global IUPnPRegistrar_GetUniqueDeviceName 6 wstr,wstr,sptr #comfunc global IUPnPRegistrar_UnregisterDevice 7 wstr,int #comfunc global IUPnPRegistrar_UnregisterDeviceProvider 8 wstr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。