LPNSPV2SETSERVICEEX
コールバックシグネチャ
void LPNSPV2SETSERVICEEX(
HANDLE hAsyncCall,
GUID* lpProviderId,
WSAQUERYSET2W* lpqsRegInfo,
WSAESETSERVICEOP essOperation,
DWORD dwControlFlags,
void* lpvClientSessionArg
);パラメーター
| フィールド | 型 | 説明 | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| hAsyncCall | HANDLE | 非同期呼び出しのために使用される、直前の NSPv2LookupServiceBegin の呼び出しから返されたハンドルです。 | ||||||||
| lpProviderId | GUID* | 名前またはサービスが登録される特定の名前空間プロバイダーの GUID へのポインターです。 | ||||||||
| lpqsRegInfo | WSAQUERYSET2W* | 登録時に更新されるプロパティ情報です。 | ||||||||
| essOperation | WSAESETSERVICEOP | 要求する操作の種類です。 このパラメーターには、Winsock2.h ヘッダーファイルで定義されている WSAESETSERVICEOP 列挙型の値のいずれかを指定できます。
| ||||||||
| dwControlFlags | DWORD | 要求する操作を制御するフラグのセットです。 このパラメーターに指定できる値は、Winsock2.h ヘッダーファイルで定義されています。 | ||||||||
| lpvClientSessionArg | void* | クライアントセッションへのポインターです。 |
公式ドキュメント
NSPv2SetServiceEx 関数は、名前空間サービスプロバイダーバージョン2 (NSPv2) プロバイダーの名前空間内で、名前またはサービスインスタンスを登録または登録解除します。
戻り値
ルーチンが成功した場合、この関数は NO_ERROR (ゼロ) を返します。ルーチンが失敗した場合は SOCKET_ERROR (すなわち 1) を返し、 WSASetLastError を使用して適切なエラーコードを設定する必要があります。
| エラーコード | 意味 |
|---|---|
| この操作を実行するための十分なメモリがありません。 | |
| 呼び出し元のルーチンには、サービスをインストールするための十分な特権がありません。 | |
| このプロバイダーに対して、1 つ以上のパラメーターが無効であるか、指定されていませんでした。 | |
| 操作がサポートされていません。このエラーは、名前空間プロバイダーがこの関数を実装していない場合に返されます。また、指定された dwControlCode が認識されないコマンドである場合にも返されることがあります。 | |
| サービスが不明です。指定された名前空間内にサービスが見つかりません。 |
解説(Remarks)
NSPv2SetServiceEx 関数は、Windows Vista 以降で利用できる名前空間サービスプロバイダーバージョン2 (NSPv2) アーキテクチャの一部として使用されます。
Windows Vista および Windows Server 2008 では、NSPv2SetServiceEx 関数は NS_EMAIL 名前空間プロバイダーに対する操作にのみ使用できます。
NSPv2Startup 関数は、新しいクライアントプロセスが名前空間プロバイダーの使用を開始するたびに呼び出されます。プロバイダーは、ppvClientSessionArg パラメーターが指すクライアントセッション引数を使用して、このセッションに関する情報を格納できます。このクライアントセッション引数は、lpvClientSessionArg パラメーターで NSPv2SetServiceEx 関数に渡すことができます。
NSPv2SetServiceEx 関数は省略可能であり、NSPv2 プロバイダーの要件に依存します。NSPv2SetServiceEx 関数を実装しない場合、NSPv2 の関数ポインターは常に NO_ERROR を返すスタブ関数を指すようにできます。
次の表に、essOperation パラメーターと dwControlFlags パラメーターの値の組み合わせを示します。
| essOperation | dwControlFlags | サービスが既に存在する場合 | サービスが存在しない場合 |
|---|---|---|---|
| **RNRSERVICE_REGISTER** | なし | オブジェクトを上書きします。指定されたアドレスのみを使用します。オブジェクトは REGISTERED になります。 | 新しいオブジェクトを作成します。指定されたアドレスのみを使用します。オブジェクトは REGISTERED になります。 |
| **RNRSERVICE_REGISTER** | **SERVICE_MULTIPLE** | オブジェクトを更新します。既存のセットに新しいアドレスを追加します。オブジェクトは REGISTERED になります。 | 新しいオブジェクトを作成します。指定されたすべてのアドレスを使用します。オブジェクトは REGISTERED になります。 |
| **RNRSERVICE_DEREGISTER** | なし | すべてのアドレスを削除しますが、名前空間からオブジェクトは削除しません。オブジェクトは DEREGISTERED になります。 | WSASERVICE_NOT_FOUND |
| **RNRSERVICE_DEREGISTER** | **SERVICE_MULTIPLE** | オブジェクトを更新します。指定されたアドレスのみを削除します。アドレスが 1 つも存在しなくなった場合にのみ、オブジェクトを DEREGISTERED としてマークします。名前空間からは削除しません。 | WSASERVICE_NOT_FOUND |
| **RNRSERVICE_DELETE** | なし | 名前空間からオブジェクトを削除します。 | WSASERVICE_NOT_FOUND |
| **RNRSERVICE_DELETE** | **SERVICE_MULTIPLE** | 指定されたアドレスのみを削除します。アドレスが残っていない場合にのみ、名前空間からオブジェクトを削除します。 | WSASERVICE_NOT_FOUND |
dwControlFlags パラメーターに SERVICE_MULTIPLE を設定すると、アプリケーションはアドレスを個別に管理できるようになります。これは、アプリケーションがプロトコルを個別に管理する必要がある場合や、サービスが複数のコンピューター上に存在する場合に役立ちます。たとえば、サービスが複数のプロトコルを使用しているとき、一方のリッスンソケットが中断しても、他のソケットは動作を継続することがあります。この例では、サービスは他のアドレスに影響を与えることなく、中断したアドレスを登録解除できます。
SERVICE_MULTIPLE を使用する場合、アプリケーションは古いアドレスをオブジェクト内に残してはなりません。これは、アプリケーションが RNRSERVICE_DEREGISTER 要求を発行せずに中断した場合に発生する可能性があります。サービスは登録時に、自身のアドレスを保存しておく必要があります。次回の呼び出しでは、サービスは新しいアドレスを登録する前に、これらの古いアドレスを明示的に登録解除する必要があります。
NSPv2SetServiceEx 関数を実装しない場合、その関数への呼び出しは WSAEOPNOTSUPP を返すスタブ関数によってインターセプトする必要があります。 NSPV2_ROUTINE 構造体内の、実装されていない NSPv2SetServiceEx 関数に対する NSPv2 の関数ポインターは、そのスタブ関数を指す必要があります。
サービスのプロパティ
次の表に、WSAQUERYSET2 のメンバー名と、サービスのプロパティデータがどのように表現されるかを示します。省略可能であり NSPv2 プロバイダーの要件に依存すると記載されているメンバーは、名前空間プロバイダーが使用しない場合に **NULL** ポインターを指定できます。| WSAQUERYSET2 のメンバー名 | サービスプロパティの説明 |
|---|---|
| **dwSize** | sizeof(WSAQUERYSET2) を設定します。これはバージョン管理の仕組みです。 |
| **lpszServiceInstanceName** | サービスインスタンス名を格納する文字列です。 |
| **lpVersion** | サービスインスタンスのバージョン番号です。このメンバーは省略可能であり、NSPv2 サービスプロバイダーの要件に依存します。 |
| **lpszComment** | コメント文字列です。このメンバーは省略可能であり、NSPv2 サービスプロバイダーの要件に依存します。 |
| **dwNameSpace** | 名前空間識別子です。このメンバーは省略可能であり、NSPv2 サービスプロバイダーの要件に依存します。 |
| **lpNSProviderId** | プロバイダー識別子です。名前空間プロバイダーの識別子は lpProviderId パラメーターでも渡されることに注意してください。このメンバーは省略可能であり、NSPv2 サービスプロバイダーの要件に依存します。 |
| **lpszContext** | 階層型名前空間におけるクエリの開始位置です。このメンバーは省略可能であり、NSPv2 サービスプロバイダーの要件に依存します。 |
| **dwNumberOfProtocols** | プロトコル制約配列のエントリ数のサイズ (バイト単位) です。このメンバーはゼロでもかまいません。このメンバーは省略可能であり、NSPv2 サービスプロバイダーの要件に依存します。 |
| **lpafpProtocols** | AFPROTOCOLS 構造体の配列です。このメンバーは省略可能であり、NSPv2 サービスプロバイダーの要件に依存します。 |
| **lpszQueryString** | 一部の名前空間 (whois++ など) は、単純なテキスト文字列で表現される SQL のようなリッチなクエリをサポートします。このパラメーターは、その文字列を指定するために使用します。このメンバーは省略可能であり、NSPv2 サービスプロバイダーの要件に依存します。 |
| **dwNumberOfCsAddrs** | lpcsaBuffer が参照する CSADDR_INFO 構造体の配列内の要素数です。 |
| **lpcsaBuffer** | サービスがリッスンしているアドレスを格納する CSADDR_INFO 構造体の配列へのポインターです。 |
| **dwOutputFlags** | このメンバーは省略可能であり、NSPv2 サービスプロバイダーの要件に依存します。 |
| **lpBlob** | プロバイダー固有のエンティティへのポインターです。このメンバーは NS_EMAIL 名前空間では必須です。その他の NSPv2 サービスプロバイダーでは、その要件に応じて省略可能です。 |
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)