Функция обратного вызова PERFLIBREQUEST (perflib.h)

Поставщики могут реализовать эту функцию для получения уведомлений, когда потребители выполняют определенные действия, например добавление или удаление счетчиков из запроса. PERFLIB вызывает обратный вызов до завершения запроса потребителя.

Тип PERFLIBREQUEST определяет указатель на эту функцию обратного вызова. Функция ControlCallback — это заполнитель для имени определяемой приложением функции.

Синтаксис

PERFLIBREQUEST Perflibrequest;

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

Параметры

[in] RequestCode

Код запроса может быть одним из следующих значений.

Ценность Meaning
PERF_ADD_COUNTER
Потребитель добавляет счетчик в запрос. PERFLIB вызывает обратный вызов с этим кодом запроса для каждого счетчика, добавляемого в запрос. Параметр Buffer содержит структуру PERF_COUNTER_IDENTITY , которая идентифицирует добавляемый счетчик.

Поставщики могут использовать это уведомление для начала подсчета.

PERF_REMOVE_COUNTER
Потребитель удаляет счетчик из запроса. PERFLIB вызывает обратный вызов с этим кодом запроса для каждого счетчика, который удаляется из запроса. Параметр Buffer содержит структуру PERF_COUNTER_IDENTITY , которая идентифицирует удаленный счетчик.

Поставщики могут использовать это уведомление для остановки подсчета.

PERF_ENUM_INSTANCES
Потребитель перечисляет экземпляры набора счетчиков. Параметр Buffer содержит строку Юникода, завершающую значение NULL, которая определяет имя компьютера (или IP-адреса), из которого потребитель перечисляет экземпляры.
PERF_COLLECT_START
Потребитель начинает собирать данные счетчика. Параметр Buffer содержит строку Юникода, завершающую значение NULL, которая определяет имя компьютера (или IP-адреса), из которого потребитель собирает данные.

Поставщики могут использовать это уведомление, если состояние необработанных данных критически важно (например, счетчики, связанные с транзакциями, в которых частичные обновления не допускаются). Это уведомление дает поставщику возможность очистить все ожидающие обновления и заблокировать будущие обновления до начала сбора.

PERF_COLLECT_END
Сбор данных счетчика завершен. Параметр Buffer содержит строку Юникода, завершающую значение NULL, которая определяет имя компьютера (или IP-адреса), из которого потребитель собирал данные.

Поставщики могут использовать это уведомление, чтобы освободить блокировку обновления, введенную уведомлением о начале сбора, чтобы обновления данных счетчика могли возобновиться.

[in] Buffer

Содержимое буфера зависит от запроса. Сведения о возможном содержимом см. в параметре RequestCode .

[in] BufferSize

Размер в байтах параметра Buffer .

Возвращаемое значение

Возвращает ERROR_SUCCESS, если обратный вызов выполнен успешно.

Если обратный вызов завершается ошибкой, PERFLIB вернет код ошибки потребителю, если запрос PERF_ADD_COUNTER, PERF_ENUM_INSTANCES или PERF_COLLECT_START; в противном случае код ошибки игнорируется.

Замечания

Если атрибут обратного вызова элемента поставщика является "настраиваемым" или вы использовали аргумент -NotificationCallback при вызове CTRPP, необходимо реализовать эту функцию. Вы передаете имя функции обратного вызова в 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 [только классические приложения]
целевая платформа Виндоус
Header perflib.h