偵測 API 集合可用性
在某些情況下,特定 API 集合合約名稱可能會刻意對應到某些 Windows 裝置上的空白模組名稱。 原因有所不同,但常見的範例是,針對資源受限裝置設定時,系統資源方面的昂貴功能可能會從 Windows OS 中移除。 這給應用程式在 API 層級正常處理選擇性功能帶來了挑戰。
測試 Win32 API 的傳統方法是使用 LoadLibrary 或 GetProcAddress。 不過,由於 Windows 10 和更新版本中的反向轉送支持,這些並不是測試 API 集合的可靠方法。 將反向轉送套用至指定的 API 時, LoadLibrary 或 GetProcAddress 可能會解析為有效的函式指標,即使內部實作已移除也一樣。 在此情況下,函式指標會指向只傳回錯誤的存根函式。
若要偵測此案例,您可以使用 IsApiSetImplemented 函式來查詢指定 API 實作的基礎可用性。 此測試會驗證呼叫此函式會導致執行 API 的功能實作。
下列程式代碼範例示範如何使用 IsApiSetImplemented 來判斷目前裝置上是否 可使用WTSEnumerateSessions 函 式,再呼叫它。
#include <windows.h>
#include <stdio.h>
#include <Wtsapi32.h>
int __cdecl wmain(int /* argc */, PCWSTR /* argv */ [])
{
PWTS_SESSION_INFO pInfo = {};
DWORD count = 0;
if (!IsApiSetImplemented("ext-ms-win-session-wtsapi32-l1-1-0"))
{
wprintf(L"IsApiSetImplemented on ext-ms-win-session-wtsapi32-l1-1-0 returns FALSE\n");
}
else
{
if (WTSEnumerateSessionsW(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pInfo, &count))
{
wprintf(L"SessionCount = %d\n", count);
for (ULONG i = 0; i < count; i++)
{
PWTS_SESSION_INFO pCurInfo = &pInfo[i];
wprintf(L" %s: ID = %d, state = %d\n", pCurInfo->pWinStationName,
pCurInfo->SessionId, pCurInfo->State);
}
WTSFreeMemory(pInfo);
}
else
{
wprintf(L"WTSEnumerateSessions failure : %x\n", GetLastError());
}
}
return 0;
}