Win32 API 日本語リファレンス
ホーム › Networking.WinSock › LPNSPLOOKUPSERVICEBEGIN

LPNSPLOOKUPSERVICEBEGIN

コールバック

シグネチャ

INT LPNSPLOOKUPSERVICEBEGIN(
    GUID* lpProviderId,
    WSAQUERYSETW* lpqsRestrictions,
    WSASERVICECLASSINFOW* lpServiceClassInfo,
    DWORD dwControlFlags,
    HANDLE* lphLookup
);

パラメーター

フィールド型説明
lpProviderIdGUID*クエリ対象のネームサービスプロバイダー識別子へのポインター。
lpqsRestrictionsWSAQUERYSETW*検索条件へのポインター。「解説」を参照してください。
lpServiceClassInfoWSASERVICECLASSINFOW*サービスのスキーマ情報を格納する WSASERVICECLASSINFO 構造体へのポインター。
dwControlFlagsDWORD

検索の深さを制御する値。

値 意味
LUP_DEEP
0x0001
最初のレベルだけでなく、プロバイダーの階層をたどって下位までクエリします。
LUP_CONTAINERS
0x0002
コンテナーのみを返します。
LUP_NOCONTAINERS
0x0004
コンテナーを返しません。
LUP_NEAREST
0x0008
可能であれば、距離の順に結果を返します。距離の尺度はプロバイダー固有です。
LUP_RETURN_NAME
0x0010
名前を **lpszServiceInstanceName** として取得します。
LUP_RETURN_TYPE
0x0020
型を **lpServiceClassId** として取得します。
LUP_RETURN_VERSION
0x0040
バージョンを **lpVersion** として取得します。
LUP_RETURN_COMMENT
0x0080
コメントを **lpszComment** として取得します。
LUP_RETURN_ADDR
0x0100
アドレスを **lpcsaBuffer** として取得します。
LUP_RETURN_BLOB
0x0200
プライベートデータを **lpBlob** として取得します。
LUP_RETURN_ALIASES
0x0400
利用可能なエイリアス情報は、以降の NSPLookupServiceNext の呼び出しで返されます。返される各エイリアスには **RESULT_IS_ALIAS** フラグが設定されます。
LUP_RETURN_QUERY_STRING
0x0800
クエリ文字列を **lpszQueryString** として取得します。
LUP_RETURN_ALL
0x0ff0
名前、型、バージョン、コメント、アドレス、BLOB、エイリアス、クエリ文字列を含む情報を取得します。
LUP_FLUSHCACHE
0x1000
プロバイダーが情報をキャッシュしている場合でも、キャッシュを無視して名前空間自体にクエリします。
LUP_FLUSHPREVIOUS
0x2000

NSPLookupServiceNext の dwControlFlags パラメーターの値として使用します。このフラグを設定すると、プロバイダーは、指定されたバッファーに対して大きすぎた直前の結果セットを破棄し、次の結果セットに進みます。

LUP_NON_AUTHORITATIVE
0x4000
名前空間プロバイダーが、名前について権威のない結果も含めることを示します。
LUP_RES_RESERVICE
0x8000
主たる応答が CSADDR_INFO 構造体のリモート部分とローカル部分のどちらにあるかを示します。いずれの場合も、もう一方の部分は使用可能でなければなりません。このオプションはサービスインスタンスの要求にのみ適用されます。
LUP_SECURE
0x8000
名前空間プロバイダーがセキュリティで保護されたクエリを使用することを示します。このオプションは名前のクエリ要求にのみ適用されます。
LUP_RETURN_PREFERRED_NAMES
0x10000
名前空間プロバイダーが優先名のみを返すことを示します。
LUP_ADDRCONFIG
0x100000
名前空間プロバイダーがアドレス構成を返すことを示します。
LUP_DUAL_ADDR
0x200000
名前空間プロバイダーがデュアルアドレスを返すことを示します。このオプションはデュアルモードソケット (IPv6 および IPv4 マップドアドレス) にのみ適用されます。
lphLookupHANDLE*結果セットを取得するために、以降の NSPLookupServiceNext の呼び出しで使用するハンドルへのポインター。

公式ドキュメント

NSPLookupServiceBegin 関数は、 WSAQUERYSET 構造体に格納された情報によって制約される、ネームサービスプロバイダーに対するクライアントからのクエリを開始します。

NSPLookupServiceBegin はハンドルのみを返します。実際の結果を取得するには、このハンドルを以降の NSPLookupServiceNext の呼び出しで使用します。この操作はキャンセルできないため、短時間で実行されるように実装してください。ネットワーククエリを開始することは差し支えありませんが、この関数は正常に返るために応答を必要としてはなりません。

戻り値

処理が成功した場合、この関数は NO_ERROR (0) を返します。処理が失敗した場合は SOCKET_ERROR (–1) を返し、 WSASetLastError を使用して適切なエラーコードを設定しなければなりません。

エラーコード 意味
WSA_NOT_ENOUGH_MEMORY
この操作を実行するための十分なメモリがありません。
WSAEINVAL
このプロバイダーにとって、1 つ以上のパラメーターが無効であるか指定されていませんでした。
WSAEOPNOTSUPP
操作がサポートされていません。名前空間プロバイダーがこの関数を実装していない場合に、このエラーが返されます。
WSANO_DATA
名前はデータベース内で見つかりましたが、解決の対象となる正しい関連データがありません。
WSASERVICE_NOT_FOUND
サービスが不明です。指定された名前空間でサービスが見つかりません。

解説(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 の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)