LPNSPLOOKUPSERVICENEXT 回調函式 (ws2spi.h)

NSPLookupServiceNext 函式會在從先前呼叫 NSPLookupServiceBegin 取得句柄之後呼叫,以擷取要求的服務資訊。

提供者會在 lpqsResults 緩衝區中傳遞 WSAQUERYSET 結構。 客戶端應該呼叫此函式,直到傳回 WSA_E_NOMORE為止,表示已傳回所有 WSAQUERYSET

語法

LPNSPLOOKUPSERVICENEXT Lpnsplookupservicenext;

INT Lpnsplookupservicenext(
  [in]      HANDLE hLookup,
  [in]      DWORD dwControlFlags,
  [in, out] LPDWORD lpdwBufferLength,
  [out]     LPWSAQUERYSETW lpqsResults
)
{...}

參數

[in] hLookup

從先前呼叫 WSALookupServiceBegin 傳回的句柄,

[in] dwControlFlags

用來控制下一個作業的旗標。 目前,只有 LUP_FLUSHPREVIOUS 定義為處理太大結果集的方法。 如果應用程式無法提供足夠大的緩衝區,設定 LUP_FLUSHPREVIOUS 會指示提供者捨棄最後一個結果集,而這個結果集太大,並移至此呼叫的下一個集合。

[in, out] lpdwBufferLength

輸入上的大小,以位元組為單位,由 lpqsResults 所指向的緩衝區中,。 在輸出中,如果函式失敗,且錯誤為 WSAEFAULT,則會包含最小大小,以位元組為單位來傳遞 lpqsResults 以擷取記錄。

[out] lpqsResults

記憶體區塊的指標,會在傳回時包含 WSAQUERYSET 結構中的一個結果集。

傳回值

如果例程成功,函式應該會傳回 NO_ERROR (零)。 如果例程失敗,且必須使用 WSASetLastError來設定適當的錯誤碼,它應該會傳回 SOCKET_ERROR (–1)。

錯誤碼 意義
WSA_E_CANCELLED
呼叫 NSPLookupServiceEnd 時,此呼叫仍在處理中。 已取消呼叫。 lpqsResults 緩衝區中的數據未定義。

在 Windows Sockets 2 中,WSAECANCELLED (10103) 和 WSA_E_CANCELLED (10111) 定義衝突的錯誤碼。WSAECANCELLED 的錯誤碼將會在未來版本中移除,而且只會保留WSA_E_CANCELLED。 Namespace提供者應該使用 WSA_E_CANCELLED 錯誤碼來維持與最廣泛應用程式範圍的相容性。

WSA_E_NO_MORE
沒有其他可用的數據。

在 Windows Sockets 2 中,WSAENOMORE (10102) 和 WSA_E_NO_MORE (10110) 定義衝突的錯誤碼。WSAENOMORE 錯誤碼將會在未來版本中移除,且只會保留WSA_E_NO_MORE。 Namespace提供者應該使用 WSA_E_NO_MORE 錯誤碼來維持與最廣泛應用程式範圍的相容性。

WSA_INVALID_HANDLE
指定的查閱句柄無效。
WSA_NOT_ENOUGH_MEMORY
記憶體不足,無法執行這項作業。
WSAEFAULT
lpqsResults 緩衝區太小,無法包含 WSAQUERYSET 集。
WSAEINVAL
此提供者的一或多個參數無效或遺失。
WSAEOPNOTSUPP
不支援此作業。 如果命名空間提供者未實作此函式,則會傳回此錯誤。
WSANO_DATA
在資料庫中找到名稱,但找不到符合指定限制的數據。
WSASERVICE_NOT_FOUND
服務未知。 在指定的命名空間中找不到服務。

言論

dwControlFlags 在此函式中指定,且在 NSPLookupServiceBegin 時指定的 會以「限制」的方式處理。 這些限制會結合 NSPLookupServiceBegin 時間與 NSPLookupServiceNext 時間的限制。 因此,NSPLookupServiceNext 的旗標 永遠無法增加在 NSPLookupServiceBegin所要求的數據量,不過指定更多或更少旗標不是錯誤。 在指定 NSPLookupServiceNext 指定的旗標 僅適用於該呼叫。

dwControlFlagsLUP_FLUSHPREVIOUSLUP_RES_SERVICE 是合併限制規則的例外狀況(因為它們是行為旗標,而不是「限制」旗標)。 如果在 NSPLookupServiceNext中使用任一旗標,則不論在 NSPLookupServiceBegin設定相同的旗 標,它們都有其定義的效果。

例如,如果在 NSPLookupServiceBegin指定 LUP_RETURN_VERSION,服務提供者會擷取包含版本的記錄。 如果未在 NSPLookupServiceNext指定 LUP_RETURN_VERSION,則傳回的資訊不會包含版本,即使版本可用也一樣。 不會產生任何錯誤。

此外,如果未在 NSPLookupServiceBegin指定 LUP_RETURN_BLOB,但在 NSPLookupServiceNext指定,則傳回的資訊不包含私用數據。 不會產生任何錯誤。

查詢結果

下表列出 WSAQUERYSET,並描述如何在 WSAQUERYSET 結構中表示查詢結果。 如需詳細資訊,請參閱 Query-Related 資料結構
WSAQUERYSET 成員名稱 結果解譯
**dwSize** 將會設定為sizeof(WSAQUERYSET)。 這會當做版本控制機制使用。
**dwOutputFlags** **RESULT_IS_ALIAS** 旗標表示這是別名結果。
**lpszServiceInstanceName** 參考包含服務名稱的字串。
**lpServiceClassId** 對應至服務類別的 GUID。
**lpVersion** 參考特定服務實例的版本號碼。
**lpszComment** 自選。 服務實例提供的批註字串。
**dwNameSpace** Namespace在其中找到服務實例。
**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 2000 Professional [僅限傳統型應用程式]
支援的最低伺服器 Windows 2000 Server [僅限傳統型應用程式]
目標平臺 窗戶
標頭 ws2spi.h

另請參閱

CSADDR_INFO

NSPLookupServiceBegin

NSPLookupServiceEnd

NSP_ROUTINE

WSAQUERYSET

WSASetLastError