共用方式為


偵測 API 集合可用性

在某些情況下,特定 API 集合合約名稱可能會刻意對應到某些 Windows 裝置上的空白模組名稱。 原因有所不同,但常見的範例是,針對資源受限裝置設定時,系統資源方面的昂貴功能可能會從 Windows OS 中移除。 這給應用程式在 API 層級正常處理選擇性功能帶來了挑戰。

測試 Win32 API 的傳統方法是使用 LoadLibraryGetProcAddress。 不過,由於 Windows 10 和更新版本中的反向轉送支持,這些並不是測試 API 集合的可靠方法。 將反向轉送套用至指定的 API 時, LoadLibraryGetProcAddress 可能會解析為有效的函式指標,即使內部實作已移除也一樣。 在此情況下,函式指標會指向只傳回錯誤的存根函式。

若要偵測此案例,您可以使用 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;
}