WSALookupServiceNextA 函式 (winsock2.h)
從先前呼叫WSALookupServiceBegin取得控制碼之後,會呼叫WSALookupServiceNext函式,以擷取要求的服務資訊。
提供者會在lpqsResults緩衝區中傳回WSAQUERYSET結構。 用戶端應該會繼續呼叫此函式,直到傳回WSA_E_NO_MORE,表示所有 WSAQUERYSET 都已傳回。
語法
INT WSAAPI WSALookupServiceNextA(
[in] HANDLE hLookup,
[in] DWORD dwControlFlags,
[in, out] LPDWORD lpdwBufferLength,
[out] LPWSAQUERYSETA lpqsResults
);
參數
[in] hLookup
從先前呼叫 WSALookupServiceBegin傳回的控制碼。
[in] dwControlFlags
一組旗標,可控制作業。 在 dwControlFlags參數中傳遞至WSALookupServiceBegin函式的值會決定可能的準則。 在 dwControlFlags 參數中傳遞至 WSALookupServiceNext 函式的任何值,會進一步限制服務查閱的準則。
目前,LUP_FLUSHPREVIOUS定義為處理太大結果集的方法。 如果應用程式未 (或無法) 提供足夠的緩衝區,則設定LUP_FLUSHPREVIOUS會指示提供者捨棄最後一個結果集,這太大,並繼續進行此呼叫的下一個集合。
dwControlFlags參數的支援值定義在Winsock2.h標頭檔中,而且可以是下列選項的組合。
旗標 | 意義 |
---|---|
|
深入查詢,而不是第一個層級。 |
|
只會傳回容器。 |
|
請勿傳回容器。 |
|
可能的話,會以距離順序傳回結果。 距離的量值是提供者特定的。 |
|
擷取名稱為 lpszServiceInstanceName。 |
|
將類型擷取為 lpServiceClassId。 |
|
將版本擷取為 lpVersion。 |
|
將批註擷取為 lpszComment。 |
|
將位址擷取為 lpcsaBuffer。 |
|
將私人資料擷取為 lpBlob。 |
|
任何可用的別名資訊都會在對 WSALookupServiceNext的後續呼叫中傳回,而傳回的每個別名都會設定RESULT_IS_ALIAS旗標。 |
|
擷取用於要求的查詢字串。 |
|
一組旗標,可擷取所有LUP_RETURN_* 值。 |
|
做為WSALookupServiceNext中dwControlFlags參數的值。 設定此旗標會指示提供者捨棄最後一個結果集,這對指定的緩衝區太大,並移至下一個結果集。 |
|
如果提供者已經快取資訊,請忽略快取,並查詢命名空間本身。 |
|
這表示主要回應位於 CSADDR_INFO 結構的遠端或本機部分。 另一個部分在任一情況下都必須可供使用。 |
[in, out] lpdwBufferLength
在輸入上, lpqsResults所指向之緩衝區中包含的位元組數目。 在輸出中,如果函式失敗且錯誤為 WSAEFAULT,則會包含要傳遞給 lpqsResults 以擷取記錄的最小位元組數。
[out] lpqsResults
記憶體區塊的指標,它會在傳回時在 WSAQUERYSET 結構中包含一個結果集。
傳回值
如果作業成功,則傳回值為零。 否則,會傳回SOCKET_ERROR值,而且可以呼叫 WSAGetLastError來擷取特定的錯誤號碼。
錯誤碼 | 意義 |
---|---|
呼叫 WSALookupServiceEnd 時,此呼叫仍在處理中。 呼叫已取消。 lpqsResults緩衝區中的資料未定義。 在 Windows Sockets 第 2 版中, WSAECANCELLED (10103) 定義衝突的錯誤碼,WSA_E_CANCELLED ( 10111) 。 未來版本將會移除錯誤碼 WSAECANCELLED,且只會保留WSA_E_CANCELLED。 不過,針對 Windows Sockets 第 2 版,應用程式應該檢查 WSAECANCELLED 和 WSA_E_CANCELLED,以取得與其中一個命名空間提供者最廣泛的相容性。 | |
沒有其他可用的資料。 在 Windows Sockets 第 2 版中, WSAENOMORE (10102) 定義衝突的錯誤碼,WSA_E_NO_MORE ( 10110) 。 未來版本將會移除錯誤碼 WSAENOMORE,而且只會保留WSA_E_NO_MORE。 不過,針對 Windows Sockets 第 2 版,應用程式應該檢查 WSAENOMORE 和 WSA_E_NO_MORE,以取得使用任一個名稱空間提供者的最大可能相容性。 | |
lpqsResults緩衝區太小而無法包含WSAQUERYSET集合。 | |
一或多個必要參數無效或遺失。 | |
指定的查閱控制碼無效。 | |
WS2_32.DLL 尚未初始化。 應用程式必須先呼叫 WSAStartup ,才能呼叫任何 Windows Sockets 函式。 | |
在資料庫中找到名稱,但找不到符合指定限制的資料。 | |
記憶體不足,無法執行作業。 |
備註
此函式中指定的 dwControlFlags 參數和 WSALookupServiceBegin 時所指定的參數會被視為組合的限制。 限制會在 WSALookupServiceBegin 時間與 WSALookupServiceNext 時間的限制之間合併。 因此 ,WSALookupServiceNext 上的旗標永遠不會增加超過 WSALookupServiceBegin要求的資料量,但指定更多或更少旗標並不錯誤。 在指定 WSALookupServiceNext 指定的旗標僅適用于該呼叫。
dwControlFlags LUP_FLUSHPREVIOUS 和 LUP_RES_SERVICE 是合併限制規則 (的例外狀況,因為它們是行為旗標,而不是) 的限制旗標。 如果 WSALookupServiceNext 中使用其中一個旗標,則不論 WSALookupServiceBegin上的相同旗標設定為何,它們都有其已定義的效果。
例如,如果在 WSALookupServiceBegin 指定LUP_RETURN_VERSION,服務提供者會擷取包含版本的記錄。 如果在 WSALookupServiceNext上未指定LUP_RETURN_VERSION,傳回的資訊就不會包含版本,即使版本可用也一樣。 不會產生任何錯誤。
例如,如果在 WSALookupServiceBegin 上未指定LUP_RETURN_BLOB,但在 WSALookupServiceNext指定,傳回的資訊就不會包含私人資料。 不會產生任何錯誤。
如果 WSALookupServiceNext 函式失敗並出現 WSAEFAULT錯誤,這表示 lpqsResults 參數指向的緩衝區太小而無法包含查詢結果。 WSAQUERYSET的新緩衝區應該以lpdwBufferLength參數所指向的值所指定的大小來提供。 WSAQUERYSET的新緩衝區必須有一些指定的WSAQUERYSET成員,然後再再次呼叫WSALookupServiceNext函式。 WSAQUERYSET的dwSize成員至少必須設定為緩衝區的新大小。
查詢結果
下表描述 如何在 WSAQUERYSET 結構中表示查詢結果。WSAQUERYSET 成員 | 結果解譯 |
---|---|
dwSize | 將會設為 sizeof ( WSAQUERYSET) 。 這會當做版本設定機制使用。 |
dwOutputFlags | RESULT_IS_ALIAS旗標表示這是別名結果。 |
lpszServiceInstanceName | 參考的字串包含服務名稱。 |
lpServiceClassId | 對應至服務類別的 GUID。 |
lpVersion | 參考特定服務實例的版本號碼。 |
lpszComment | 服務實例指定的選擇性批註字串。 |
dwNameSpace | 在其中找到服務實例的命名空間。 |
lpNSProviderId | 識別提供此查詢結果的特定命名空間提供者。 |
lpszCoNtext | 指定服務所在階層命名空間中的內容點。 |
dwNumberOfProtocols | 針對結果未定義。 |
lpafpProtocols | 針對結果未定義,所有必要的通訊協定資訊都位於 CSADDR_INFO 結構中。 |
lpszQueryString | 當 dwControlFlags包含LUP_RETURN_QUERY_STRING時,此參數會傳回原始查詢中指定的lpszServiceInstanceName未剖析其餘部分。 例如,在依階層式名稱識別服務的命名空間中,指定主機名稱和該主機內的檔案路徑,傳回的位址可能是主機位址,而未剖析的其餘部分可能是檔案路徑。 如果完全剖析 lpszServiceInstanceName 且使用LUP_RETURN_QUERY_STRING,則此參數為 Null ,或指向長度為零的字串。 |
dwNumberOfCsAddrs | 指出 CSADDR_INFO 結構陣列中的專案數目。 |
lpcsaBuffer | CSADDR_INFO結構陣列的指標,每個元素都包含一個完整的傳輸位址。 |
lpBlob | (選擇性) 這是提供者特定實體的指標。 |
Windows Phone 8:Windows Phone 8 和更新版本上的 Windows Phone Store 應用程式支援WSALookupServiceNextW函式。
Windows 8.1和Windows Server 2012 R2:Windows 8.1、Windows Server 2012 R2 及更新版本的 Windows 市集應用程式支援WSALookupServiceNextW函式。
注意
winsock2.h 標頭會根據 UNICODE 預處理器常數的定義,將 WSALookupServiceNext 定義為別名,自動選取此函式的 ANSI 或 Unicode 版本。 混合使用編碼中性別名與非編碼中性的程式碼,可能會導致編譯或執行時間錯誤不符。 如需詳細資訊,請參閱 函式原型的慣例。
規格需求
最低支援的用戶端 | Windows 8.1、Windows Vista [傳統型應用程式 |UWP 應用程式] |
最低支援的伺服器 | Windows Server 2003 [傳統型應用程式 |UWP 應用程式] |
目標平台 | Windows |
標頭 | winsock2.h |
程式庫 | Ws2_32.lib |
Dll | Ws2_32.dll |