在某些情況下,特定 API 集合合約名稱可能會刻意對應到某些 Windows 裝置上的空白模組名稱。 原因有所不同,但常見的範例是,針對資源受限裝置設定時,系統資源方面的昂貴功能可能會從 Windows OS 中移除。 這給應用程式在 API 層級正常處理選擇性功能帶來了挑戰。
測試 Win32 API 的傳統方法是使用 LoadLibrary 或 GetProcAddress。 不過,這些不是測試 API 集合的可靠方法,因為 windows 10 和更新版本中 反向轉送 支援。 將反向轉送套用至指定的 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;
}