提供者可以實作此功能,當消費者執行特定動作時,例如新增或移除查詢中的計數器,接收通知。 PERFLIB 會在消費者的請求完成前呼叫回調。
PERFLIBREQUEST 型別定義了指向此回調函式的指標。 ControlCallback 函式是應用程式定義函式名稱的佔位符。
語法
PERFLIBREQUEST Perflibrequest;
ULONG Perflibrequest(
[in] ULONG RequestCode,
[in] PVOID Buffer,
[in] ULONG BufferSize
)
{...}
參數
[in] RequestCode
請求碼可以是以下其中一種值。
| 價值觀 | Meaning |
|---|---|
|
消費者是在查詢中加入一個反數。 PERFLIB 會呼叫回調,並針對每個加入的計數器呼叫此請求碼。
緩衝區參數包含一個PERF_COUNTER_IDENTITY結構,用以識別被加入的計數器。
醫療提供者可以利用此通知開始計數。 |
|
消費者是在查詢中移除一個計數器。 PERFLIB 會呼叫回調,並針對每個被移除的計數器使用此請求碼。
緩衝區參數包含一個PERF_COUNTER_IDENTITY結構,用以識別被移除的計數器。
醫療提供者可以利用此通知停止計數。 |
|
消費者是在列舉計數器集的實例。 緩衝區參數包含一個 null 終止的 Unicode 字串,用以識別消費者枚舉實例的電腦名稱(或其 IP 位址)。 |
|
消費者開始收集反向數據。
緩衝區參數包含一個 null 終止的 Unicode 字串,用以識別消費者收集資料的電腦名稱(或其 IP 位址)。
當原始資料狀態至關重要時(例如交易相關計數器,不允許部分更新),提供者可以使用此通知。 此通知讓服務提供者有機會在收款開始前清除所有待更新並鎖定未來更新。 |
|
計數數據收集完成。
Buffer 參數包含一個 null 終止的 Unicode 字串,用以識別消費者收集資料的電腦名稱(或其 IP 位址)。
提供者可利用此通知解除集合開始通知所施加的更新鎖定,以便計數器資料的更新能繼續進行。 |
[in] Buffer
緩衝區的內容取決於請求本身。 關於可能的內容,請參見 RequestCode 參數。
[in] BufferSize
緩 衝 區參數的大小,以位元組為單位。
返回值
如果回撥成功,請回ERROR_SUCCESS。
若回調失敗,PERFLIB 會在請求為 PERF_ADD_COUNTER、 PERF_ENUM_INSTANCES 或 PERF_COLLECT_START 時將錯誤碼回傳給消費者;否則,錯誤代碼將被忽略。
備註
如果提供者元素的 callback 屬性是「自訂」的,或你在呼叫 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;
}
需求
| Requirement | 價值觀 |
|---|---|
| 最低支援的用戶端 | Windows Vista [僅限傳統型應用程式] |
| 支援的最低伺服器 | Windows Server 2008 [僅限傳統型應用程式] |
| 目標平臺 | 窗戶 |
| Header | Perflib.h |