共用方式為


PERFLIBREQUEST 回呼函式 (perflib.h)

提供者可以實作此函式,以在取用者執行特定動作時接收通知,例如從查詢新增或移除計數器。 PERFLIB 會在取用者的要求完成之前呼叫回呼。

PERFLIBREQUEST 類型會定義這個回呼函式的指標。 ControlCallback 函式是應用程式定義函數名稱的佔位元。

語法

PERFLIBREQUEST Perflibrequest;

ULONG Perflibrequest(
  [in] ULONG RequestCode,
  [in] PVOID Buffer,
  [in] ULONG BufferSize
)
{...}

參數

[in] RequestCode

要求程式代碼可以是下列其中一個值。

意義
PERF_ADD_COUNTER
取用者正在將計數器新增至查詢。 PERFLIB 會針對要新增至查詢的每個計數器,使用此要求代碼呼叫回呼。 Buffer 參數包含PERF_COUNTER_IDENTITY結構,可識別要加入的計數器。

提供者可以使用此通知來開始計算。

PERF_REMOVE_COUNTER
取用者正在從查詢中移除計數器。 PERFLIB 會針對要從查詢中移除的每個計數器,使用此要求代碼呼叫回呼。 Buffer 參數包含PERF_COUNTER_IDENTITY結構,可識別要移除的計數器。

提供者可以使用此通知來停止計數。

PERF_ENUM_INSTANCES
取用者正在列舉計數器集合的實例。 Buffer 參數包含 Null 終止的 Unicode 字串串,可識別電腦名稱 (或其 IP 位址) 取用者列舉實例。
PERF_COLLECT_START
取用者開始收集計數器數據。 Buffer 參數包含 Null 終止的 Unicode 字串,可識別取用者收集數據的電腦名稱 (或其 IP 位址) 。

例如,如果原始數據狀態很重要, (提供者可以使用此通知,例如,不允許部分更新的交易相關計數器) 。 此通知可讓提供者有機會排清所有擱置的更新,並在收集開始之前鎖定未來的更新。

PERF_COLLECT_END
計數器數據收集已完成。 Buffer 參數包含 Null 終止的 Unicode 字串,可識別取用者收集數據 (或其 IP 位址) 的電腦名稱。

提供者可以使用此通知來釋放集合啟動通知所加加的更新鎖定,讓計數器數據的更新可以繼續。

[in] Buffer

緩衝區的內容取決於要求。 如需可能的內容,請參閱 RequestCode 參數。

[in] BufferSize

Buffer 參數的大小,以位元組為單位。

傳回值

如果回呼成功,則傳回ERROR_SUCCESS。

如果回呼失敗,如果要求PERF_ADD_COUNTERPERF_ENUM_INSTANCES或PERF_COLLECT_START,PERFLIB 就會將錯誤碼傳回給取用者;否則會忽略錯誤碼。

備註

如果提供者專案的回呼屬性是 「custom」,或您在呼叫 CTRPP 時使用了 -NotificationCallback 自變數,您必須實作此函式。 您會將回呼函式的名稱傳遞至 CounterInitialize

Windows Vista: CounterInitialize 函式名為 PerfAutoInitializeCTRPP 工具也會為您產生此回呼的基本架構,其中包含所有要求代碼。 接著,您會將程式代碼新增至您想要支援的要求碼,並移除其他人。

回呼必須在一秒內完成。 如果回呼未及時完成,PERFLIB 會繼續取用者的要求,並在完成時忽略回呼的傳回值。

範例

下列範例示範 ControlCallback 函式的簡單實作。

ULONG MyControlCallback(ULONG RequestCode, PVOID pBuffer, ULONG* pBufferSize)
{
    ULONG Status = ERROR_SUCCESS;
    PWNODE_HEADER Wnode = (PWNODE_HEADER)pBuffer;
    LPWSTR pComputerName = NULL;
    LPWSTR pInstance = NULL;
    PPERF_COUNTER_IDENTITY pCounter;
    UNREFERENCED_PARAMETER(pBufferSize);

    switch (RequestCode) 
    {
        case PERF_ADD_COUNTER:
            pCounter = (PPERF_COUNTER_IDENTITY)(((LPBYTE) Wnode) + sizeof(WNODE_HEADER));
            pComputerName = (LPWSTR)(((LPBYTE) pCounter) + pCounter->MachineOffset);
            pInstance = (pCounter->NameOffset > 0) 
                ? (LPWSTR) (((LPBYTE) pCounter) + pCounter->NameOffset) : NULL;
            
            break;

        case PERF_REMOVE_COUNTER: 
            pCounter = (PPERF_COUNTER_IDENTITY)(((LPBYTE) Wnode) + sizeof(WNODE_HEADER));
            pComputerName = (LPWSTR)(((LPBYTE) pCounter) + pCounter->MachineOffset);
            pInstance = (pCounter->NameOffset > 0)
                ? (LPWSTR) (((LPBYTE) pCounter) + pCounter->NameOffset) : NULL;
            
            break;

        case PERF_ENUM_INSTANCES:
            pComputerName = (LPWSTR) (((LPBYTE) Wnode) + sizeof(WNODE_HEADER));
            
            break;

        case PERF_COLLECT_START: 
            pComputerName = (LPWSTR) (((LPBYTE) Wnode) + sizeof(WNODE_HEADER));
            
            break;

        case PERF_COLLECT_END: 
            pComputerName = (LPWSTR) (((LPBYTE) Wnode) + sizeof(WNODE_HEADER));
            
            break;

        default:
            wprintf(L"Unknown request code, %lu\n", RequestCode);
    }

    return Status;
}

規格需求

需求
最低支援的用戶端 Windows Vista [僅限傳統型應用程式]
最低支援的伺服器 Windows Server 2008 [僅限傳統型應用程式]
目標平台 Windows
標頭 perflib.h