LPNSPLOOKUPSERVICEBEGIN
コールバックシグネチャ
INT LPNSPLOOKUPSERVICEBEGIN(
GUID* lpProviderId,
WSAQUERYSETW* lpqsRestrictions,
WSASERVICECLASSINFOW* lpServiceClassInfo,
DWORD dwControlFlags,
HANDLE* lphLookup
);パラメーター
| フィールド | 型 | 説明 | ||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| lpProviderId | GUID* | クエリ対象のネームサービスプロバイダー識別子へのポインター。 | ||||||||||||||||||||||||||||||||||||||||||||
| lpqsRestrictions | WSAQUERYSETW* | 検索条件へのポインター。「解説」を参照してください。 | ||||||||||||||||||||||||||||||||||||||||||||
| lpServiceClassInfo | WSASERVICECLASSINFOW* | サービスのスキーマ情報を格納する WSASERVICECLASSINFO 構造体へのポインター。 | ||||||||||||||||||||||||||||||||||||||||||||
| dwControlFlags | DWORD | 検索の深さを制御する値。
| ||||||||||||||||||||||||||||||||||||||||||||
| lphLookup | HANDLE* | 結果セットを取得するために、以降の NSPLookupServiceNext の呼び出しで使用するハンドルへのポインター。 |
公式ドキュメント
NSPLookupServiceBegin 関数は、 WSAQUERYSET 構造体に格納された情報によって制約される、ネームサービスプロバイダーに対するクライアントからのクエリを開始します。
NSPLookupServiceBegin はハンドルのみを返します。実際の結果を取得するには、このハンドルを以降の NSPLookupServiceNext の呼び出しで使用します。この操作はキャンセルできないため、短時間で実行されるように実装してください。ネットワーククエリを開始することは差し支えありませんが、この関数は正常に返るために応答を必要としてはなりません。
戻り値
処理が成功した場合、この関数は NO_ERROR (0) を返します。処理が失敗した場合は SOCKET_ERROR (–1) を返し、 WSASetLastError を使用して適切なエラーコードを設定しなければなりません。
| エラーコード | 意味 |
|---|---|
| この操作を実行するための十分なメモリがありません。 | |
| このプロバイダーにとって、1 つ以上のパラメーターが無効であるか指定されていませんでした。 | |
| 操作がサポートされていません。名前空間プロバイダーがこの関数を実装していない場合に、このエラーが返されます。 | |
| 名前はデータベース内で見つかりましたが、解決の対象となる正しい関連データがありません。 | |
| サービスが不明です。指定された名前空間でサービスが見つかりません。 |
解説(Remarks)
呼び出しで LUP_CONTAINERS を指定する場合は、他の制約値をすべて指定しないようにしてください。指定された場合、ネームサービスプロバイダーは、コンテナーに対してその制約をサポートできるかどうかを判断しなければなりません。できない場合はエラーを返してください。
ネームサービスプロバイダーによっては、コンテナーを検索する別の手段を備えていることがあります。たとえば、コンテナーがすべて特定の既知の型、または既知の型の集合であれば、それらを検索するためのクエリ制約を作成できます。ネームサービスプロバイダーがコンテナーを特定するどのような手段を備えていても、LUP_CONTAINERS と LUP_NOCONTAINERS が優先されます。したがって、コンテナーを含むクエリ制約が指定されていても、LUP_NOCONTAINERS を指定するとコンテナー項目は返されません。同様に、クエリ制約がどのようなものであっても、LUP_CONTAINERS が指定された場合はコンテナーのみを返してください。名前空間がコンテナーをサポートしておらず、LUP_CONTAINERS が指定された場合は、WSANO_DATA を返してください。
あるコンテナー内のコンテナーを取得する推奨される方法は、次の呼び出しです。
dwStatus = NSPLookupServiceBegin(
lpqsRestrictions,
LUP_CONTAINERS,
lphLookup);
この呼び出しに続けて、必要な回数だけ NSPLookupServiceNext を呼び出します。これにより、開始コンテキストの直下に含まれるすべてのコンテナーが返されます。つまり、これは深い階層まで探索するクエリではありません。これを利用すると、階層をたどってアドレス空間の構造をマッピングし、必要に応じて選択したコンテナーの内容を列挙できます。以降の NSPLookupServiceBegin の呼び出しでは、前回の呼び出しで返されたコンテナーを使用します。
クエリの作成
前述のとおり、クエリを限定するために、 WSAQUERYSET 構造体を NSPLookupServiceBegin の入力パラメーターとして使用します。次の表は WSAQUERYSET のメンバー名と、 WSAQUERYSET を使用してクエリを構成する方法を示しています。メンバーが (省略可能) と記されている場合は NULL ポインターを指定でき、そのパラメーターを検索条件として使用しないことを意味します。詳細については、クエリ関連のデータ構造を参照してください。
| WSAQUERYSET のメンバー名 | クエリでの解釈 |
|---|---|
| **dwSize** | sizeof(WSAQUERYSET) が設定されます。これはバージョン管理の仕組みです。 |
| **dwOutputFlags** | クエリでは無視されます。 |
| **lpszServiceInstanceName** | 省略可能。参照先の文字列にはサービス名が格納されます。文字列内でのワイルドカードの意味は定義されていませんが、特定の名前空間プロバイダーがサポートしている場合があります。 |
| **lpServiceClassId** | 必須。サービスクラスに対応する GUID。 |
| **lpVersion** | 省略可能。目的のバージョン番号を参照し、バージョンの比較方法 (バージョンが完全に一致しなければならない、または指定された値以上でなければならない) を指定します。 |
| **lpszComment** | クエリでは無視されます。 |
| **dwNameSpace** | 検索範囲を限定する単一の名前空間の識別子。すべての名前空間を対象とする場合は **NS_ALL** を指定します。 |
| **lpNSProviderId** | 省略可能。特定の名前空間プロバイダーの GUID を参照し、クエリをそのプロバイダーのみに限定します。 |
| **lpszContext** | 省略可能。階層型の名前空間におけるクエリの開始点を指定します。 |
| **dwNumberOfProtocols** | プロトコル制約の配列に含まれるエントリ数のサイズ (バイト単位)。0 でもかまいません。 |
| **lpafpProtocols** | 省略可能。 AFPROTOCOLS 構造体の配列への参照。これらのプロトコルを使用するサービスのみが返されます。プロトコルファミリの値として **AF_UNSPEC** を指定することもでき、その場合はワイルドカードを意味します。名前空間プロバイダーは、アドレスファミリに関係なく、対応するプロトコルを使用する任意のサービスの情報を提供できます。 |
| **lpszQueryString** | 省略可能。一部の名前空間 (whois++ など) は、単純なテキスト文字列で表現される SQL に似た高度なクエリをサポートします。このパラメーターはその文字列を指定するために使用します。 |
| **dwNumberOfCsAddrs** | クエリでは無視されます。 |
| **lpcsaBuffer** | クエリでは無視されます。 |
| **lpBlob** | 省略可能。プロバイダー固有のエンティティへのポインター。 |
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)