要获取指定进程的网络发送和接收速率,可以使用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,并检查返回的句柄是否有效。

如果问题仍然存在,请提供更多代码或错误信息的详细信息,以便我们更好地帮助您。

windows下获取指定进程网络发送接受速率代码C++已以及调用PdhCollectQueryData返回失败-2147481643

原文地址: https://www.cveoy.top/t/topic/ic2e 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录