PERFLIBREQUEST 回呼函式 (perflib.h)
提供者可以實作此函式,以在取用者執行特定動作時接收通知,例如從查詢新增或移除計數器。 PERFLIB 會在取用者的要求完成之前呼叫回呼。
PERFLIBREQUEST 類型會定義這個回呼函式的指標。 ControlCallback 函式是應用程式定義函數名稱的佔位元。
語法
PERFLIBREQUEST Perflibrequest;
ULONG Perflibrequest(
[in] ULONG RequestCode,
[in] PVOID Buffer,
[in] ULONG BufferSize
)
{...}
參數
[in] RequestCode
要求程式代碼可以是下列其中一個值。
值 | 意義 |
---|---|
|
取用者正在將計數器新增至查詢。 PERFLIB 會針對要新增至查詢的每個計數器,使用此要求代碼呼叫回呼。 Buffer 參數包含PERF_COUNTER_IDENTITY結構,可識別要加入的計數器。
提供者可以使用此通知來開始計算。 |
|
取用者正在從查詢中移除計數器。 PERFLIB 會針對要從查詢中移除的每個計數器,使用此要求代碼呼叫回呼。 Buffer 參數包含PERF_COUNTER_IDENTITY結構,可識別要移除的計數器。
提供者可以使用此通知來停止計數。 |
|
取用者正在列舉計數器集合的實例。 Buffer 參數包含 Null 終止的 Unicode 字串串,可識別電腦名稱 (或其 IP 位址) 取用者列舉實例。 |
|
取用者開始收集計數器數據。 Buffer 參數包含 Null 終止的 Unicode 字串,可識別取用者收集數據的電腦名稱 (或其 IP 位址) 。
例如,如果原始數據狀態很重要, (提供者可以使用此通知,例如,不允許部分更新的交易相關計數器) 。 此通知可讓提供者有機會排清所有擱置的更新,並在收集開始之前鎖定未來的更新。 |
|
計數器數據收集已完成。 Buffer 參數包含 Null 終止的 Unicode 字串,可識別取用者收集數據 (或其 IP 位址) 的電腦名稱。
提供者可以使用此通知來釋放集合啟動通知所加加的更新鎖定,讓計數器數據的更新可以繼續。 |
[in] Buffer
緩衝區的內容取決於要求。 如需可能的內容,請參閱 RequestCode 參數。
[in] BufferSize
Buffer 參數的大小,以位元組為單位。
傳回值
如果回呼成功,則傳回ERROR_SUCCESS。
如果回呼失敗,如果要求PERF_ADD_COUNTER、PERF_ENUM_INSTANCES或PERF_COLLECT_START,PERFLIB 就會將錯誤碼傳回給取用者;否則會忽略錯誤碼。
備註
如果提供者專案的回呼屬性是 「custom」,或您在呼叫 CTRPP 時使用了 -NotificationCallback 自變數,您必須實作此函式。 您會將回呼函式的名稱傳遞至 CounterInitialize。
Windows Vista: CounterInitialize 函式名為 PerfAutoInitialize。 CTRPP 工具也會為您產生此回呼的基本架構,其中包含所有要求代碼。 接著,您會將程式代碼新增至您想要支援的要求碼,並移除其他人。
回呼必須在一秒內完成。 如果回呼未及時完成,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 |