windows下获取指定进程网络发送接受速率代码C++已以及调用PdhCollectQueryData返回失败-2147481643
要获取指定进程的网络发送和接收速率,可以使用Windows Performance Data Helper (PDH) 库。以下是一个示例代码:
#include <iostream>
#include <windows.h>
#include <Pdh.h>
#include <PdhMsg.h>
#pragma comment(lib, "pdh.lib")
int main()
{
PDH_STATUS status;
HQUERY query;
HCOUNTER counterSent, counterReceived;
PDH_FMT_COUNTERVALUE valueSent, valueReceived;
// 创建查询对象
status = PdhOpenQuery(NULL, 0, &query);
if (status != ERROR_SUCCESS) {
std::cerr << "PdhOpenQuery failed with status " << status << std::endl;
return 1;
}
// 添加发送速率计数器
status = PdhAddCounter(query, L"\\Process(<进程名>)\\IO Data Bytes/sec", 0, &counterSent);
if (status != ERROR_SUCCESS) {
std::cerr << "PdhAddCounter failed with status " << status << std::endl;
PdhCloseQuery(query);
return 1;
}
// 添加接收速率计数器
status = PdhAddCounter(query, L"\\Process(<进程名>)\\IO Other Bytes/sec", 0, &counterReceived);
if (status != ERROR_SUCCESS) {
std::cerr << "PdhAddCounter failed with status " << status << std::endl;
PdhCloseQuery(query);
return 1;
}
// 收集数据
status = PdhCollectQueryData(query);
if (status != ERROR_SUCCESS) {
std::cerr << "PdhCollectQueryData failed with status " << status << std::endl;
PdhCloseQuery(query);
return 1;
}
// 获取发送速率
status = PdhGetFormattedCounterValue(counterSent, PDH_FMT_DOUBLE, NULL, &valueSent);
if (status != ERROR_SUCCESS) {
std::cerr << "PdhGetFormattedCounterValue failed with status " << status << std::endl;
PdhCloseQuery(query);
return 1;
}
// 获取接收速率
status = PdhGetFormattedCounterValue(counterReceived, PDH_FMT_DOUBLE, NULL, &valueReceived);
if (status != ERROR_SUCCESS) {
std::cerr << "PdhGetFormattedCounterValue failed with status " << status << std::endl;
PdhCloseQuery(query);
return 1;
}
// 打印发送和接收速率
std::cout << "发送速率: " << valueSent.doubleValue << " 字节/秒" << std::endl;
std::cout << "接收速率: " << valueReceived.doubleValue << " 字节/秒" << std::endl;
// 关闭查询对象
PdhCloseQuery(query);
return 0;
}
请注意,上述代码中的<进程名>需要替换为你要监视的进程的名称。另外,确保已将pdh.lib库添加到链接器附加依赖项中,并将pdh.dll文件放置在可执行文件所在的目录中。
关于PdhCollectQueryData返回失败的问题,错误码-2147481643对应的十六进制值为0x800007D5,表示PDH_INVALID_HANDLE,即无效的句柄。这可能是由于未正确创建查询对象或计数器导致的。请确保在调用PdhAddCounter之前已成功调用了PdhOpenQuery,并检查返回的句柄是否有效。
如果问题仍然存在,请提供更多代码或错误信息的详细信息,以便我们更好地帮助您。
原文地址: https://www.cveoy.top/t/topic/ic2e 著作权归作者所有。请勿转载和采集!