LPNSPSETSERVICE
コールバックシグネチャ
INT LPNSPSETSERVICE(
GUID* lpProviderId,
WSASERVICECLASSINFOW* lpServiceClassInfo,
WSAQUERYSETW* lpqsRegInfo,
WSAESETSERVICEOP essOperation,
DWORD dwControlFlags
);パラメーター
| フィールド | 型 | 説明 | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| lpProviderId | GUID* | サービスが登録される特定の名前空間プロバイダーの GUID へのポインター。 | ||||||||
| lpServiceClassInfo | WSASERVICECLASSINFOW* | サービスクラスのスキーマ情報。 | ||||||||
| lpqsRegInfo | WSAQUERYSETW* | 登録時に更新されるプロパティ情報。 | ||||||||
| essOperation | WSAESETSERVICEOP | 要求される操作の種類。 このパラメーターには、Winsock2.h ヘッダーファイルで定義されている WSAESETSERVICEOP 列挙型の値のいずれかを指定できます。
| ||||||||
| dwControlFlags | DWORD | 要求されるサービス操作を制御するフラグのセット。 このパラメーターに指定可能な値は、Winsock2.h ヘッダーファイルで定義されています。 |
公式ドキュメント
NSPSetService 関数は、名前空間内にサービスインスタンスを登録または登録解除します。
戻り値
ルーチンが成功した場合、関数は NO_ERROR (ゼロ) を返します。ルーチンが失敗した場合は SOCKET_ERROR (–1) を返し、 WSASetLastError を使用して適切なエラーコードを設定する必要があります。
| エラーコード | 意味 |
|---|---|
| 呼び出し元のルーチンに、サービスをインストールするための十分な権限がありません。 | |
| この操作を実行するために利用できるメモリが不足しています。 | |
| このプロバイダーに対して、1 つ以上のパラメーターが無効であるか、指定されていません。 | |
| 操作がサポートされていません。名前空間プロバイダーがこの関数を実装していない場合に、このエラーが返されます。 | |
| サービスが不明です。指定された名前空間内でサービスが見つかりません。 |
解説(Remarks)
次の表に、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 要求を発行せずに異常終了した場合に発生する可能性があります。サービスは登録時に自身のアドレスを保存しておく必要があります。次回の呼び出しでは、新しいアドレスを登録する前に、これらの古いアドレスを明示的に登録解除する必要があります。
サービスプロパティ
次の表は、WSAQUERYSET のメンバー名と、サービスプロパティのデータがどのように表現されるかを示しています。(省略可能) と記載されているメンバーには、null ポインターを指定できます。| WSAQUERYSET のメンバー名 | サービスプロパティの説明 |
|---|---|
| **dwSize** | sizeof(WSAQUERYSET) を設定します。これはバージョン管理のための仕組みです。 |
| **lpszServiceInstanceName** | 参照先の文字列には、サービスインスタンス名が格納されます。 |
| **lpServiceClassId** | このサービスクラスに対応する GUID。 |
| **lpVersion** | 省略可能。サービスインスタンスのバージョン番号を指定します。 |
| **lpszComment** | 省略可能。任意のコメント文字列。 |
| **dwNameSpace** | この操作では無視されます。 |
| **lpNSProviderId** | この操作では無視されます。プロバイダー識別子は lpProviderId パラメーターに格納されます。 |
| **lpszContext** | 省略可能。階層型名前空間におけるクエリの開始位置。 |
| **dwNumberOfProtocols** | この操作では無視されます。 |
| **lpafpProtocols** | この操作では無視されます。 |
| **pszQueryString** | この操作では無視されます。 |
| **dwNumberOfCsAddrs** | lpcsaBuffer が参照する CSADDR_INFO 構造体の配列の要素数。 |
| **lpcsaBuffer** | サービスがリッスンしているアドレスを格納した CSADDR_INFO 構造体の配列へのポインター。 |
| **dwOutputFlags** | この操作では無視されます。 |
| **lpBlob** | 省略可能。プロバイダー固有のエンティティへのポインター。 |
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)