我正在尝试使用Windows性能计数器来获取特定进程的虚拟字节使用情况。阅读%CPU使用率似乎更简单,所以我想我会尝试先让它工作。
在文件的顶部,我有这个:
#include <pdh.h>
#include <pdhmsg.h>
然后在一个函数中,我有这个:
PDH_STATUS status = ERROR_SUCCESS;
PDH_HQUERY query = NULL;
status = PdhOpenQuery(
NULL,
0,
&query);
CHECK(status == ERROR_SUCCESS, L"Couldn't create query.");
PDH_HCOUNTER counter = NULL;
status = PdhAddCounter(query, L"\\Processor(_Total)\\% Processor Time", 0, &counter);
CHECK(status == ERROR_SUCCESS, L"Couldn't add counter.");
status = PdhCollectQueryData(query);
CHECK(status == ERROR_SUCCESS, L"Couldn't collect query data.");
Sleep(2000);
status = PdhCollectQueryData(query);
CHECK(status == ERROR_SUCCESS, L"Couldn't collect query data.");
Sleep(2000);
PDH_RAW_COUNTER rawValue;
status = PdhGetRawCounterValue(&counter, NULL, &rawValue);
CHECK(status == ERROR_SUCCESS, L"Couldn't get the raw counter value.");
status = PdhCloseQuery(&query);
CHECK(status == ERROR_SUCCESS, L"Couldn't close the query handle.");
CHECK是要在项目中断言的宏。在调用PdhGetRawCounterValue()之前,每次调用时状态为ERROR_SUCCESS。当我调用该函数时,结果是0xC0000BBC,它在pdhmsg.h中定义为PDH_INVALID_HANDLE。调用Sleep()的原因是this page表示您需要为某些计数器读取两个样本并在两者之间等待至少一秒。
我做错了吗?
答案 0 :(得分:3)
我认为您需要删除&符号(不要使用计数器的地址):
status = PdhGetRawCounterValue(counter, NULL, &rawValue);
看起来对PdhCloseQuery的调用也可能不应该传递参数的地址。
status = PdhCloseQuery(query);