随雨(rendao0563)进来)利用PdhAddCounter获取I/O相关信息和网络信息

chmdcr 2009-07-24 12:24:42
利用PdhAddCounter获取相关计数器 但想取得 任务管理器中的I/O读取,I/O写入不知道该和哪个进行对应是\\process(something)\\IO Read Operations/sec 么?貌似不大对啊

第二 取网卡的相关信息 Bytes Received/sec 的执行参数为
"\NetWork Interface(Broadcom 440x 10/100 Integrated Controller - 数据包计划程序微型端口)\Bytes Received/sec"
其中(Broadcom 440x 10/100 Integrated Controller - 数据包计划程序微型端口)为根据IP获得到的网卡的描述
为什么在执行PdhCollectQueryData不成功的返回值为 -2147481643??
难道是涉及到中文时有字符编码上的区别么?


PS 本贴分为50 另外50为补给rendao0563的 但如果他不出现 哼哼。。。。
...全文
538 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
rendao0563 2009-07-27
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 chmdcr 的回复:]
晕C/C++ code//添加计数器bool CSystemInfo::_AddCounter(constchar* pszDesc)
{
HCOUNTER* pca= (HCOUNTER*)GlobalAlloc(GPTR, (sizeof(HCOUNTER)));
m_oHCountMap[pszDesc]= pca;return (ERROR_SUCCESS== PdhAddCounter(m_hQuery, pszDesc,0, pca));
}
m_oHCountMap是成员变量 每次都加?????

那不是开玩笑么? 无端的折腾CPU么不是

现在的问题是  在别的机器上(网卡的描述没有中文时)是对的  在我的机器上(网卡描述有中文)取网卡相关信息时是错的
[/Quote]

前面我说错了。你的用法应该是对的。估计是其他问题。
rendao0563 2009-07-27
  • 打赏
  • 举报
回复
你工程是Unicode还是?
chmdcr 2009-07-27
  • 打赏
  • 举报
回复

//添加计数器
bool CSystemInfo::_AddCounter(const char * pszDesc)
{
HCOUNTER* pca = (HCOUNTER *)GlobalAlloc(GPTR, (sizeof(HCOUNTER)));
m_oHCountMap[pszDesc] = pca;
return (ERROR_SUCCESS == PdhAddCounter(m_hQuery, pszDesc, 0, pca));
}

m_oHCountMap是成员变量 每次都加?????

那不是开玩笑么? 无端的折腾CPU么不是

现在的问题是 在别的机器上(网卡的描述没有中文时)是对的 在我的机器上(网卡描述有中文)取网卡相关信息时是错的
chmdcr 2009-07-27
  • 打赏
  • 举报
回复
GetAdaptersInfo 取出来的应该ANSC
PdhAddCounter 也默认调PdhAddCounterA 也不知道到底问题出在哪 结贴先
晨星 2009-07-24
  • 打赏
  • 举报
回复
第一个应该就是\process(something)\\IO Read Operations/sec。“IO Read Bytes/sec”对应的是另一个。
第二个你可以先试试这个:
\\TRANSOFT-ROCK\Network Interface(MS TCP Loopback interface)\Bytes Sent/sec
看看不含中文的会不会有问题,然后再进一步诊断。
rendao0563 2009-07-24
  • 打赏
  • 举报
回复
 
m_strIp = GetIp(); //获得的IP为192.168.20.16
m_SystemInfo.AddNetCounter(m_strIp,"Bytes Received/sec");
m_SystemInfo.AddNetCounter(m_strIp,"Bytes Sent/sec");


扔到timer里面去。都跟你说add和get要成对。
chmdcr 2009-07-24
  • 打赏
  • 举报
回复
Broadcom 440x 10/100 Integrated Controller - 数据包计划程序微型端口
是通过函数取出来的 我也试过只用Broadcom 440x 10/100 Integrated Controller来取 也不行始终返回 -1
chmdcr 2009-07-24
  • 打赏
  • 举报
回复
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

D:\Documents and Settings\wangxiaodong>ipconfig /all

Windows IP Configuration

Host Name . . . . . . . . . . . . : wang
Primary Dns Suffix . . . . . . . : thesc.com
Node Type . . . . . . . . . . . . : Hybrid
IP Routing Enabled. . . . . . . . : No
WINS Proxy Enabled. . . . . . . . : No
DNS Suffix Search List. . . . . . : thesc.com

Ethernet adapter 本地连接:

Connection-specific DNS Suffix . :
Description . . . . . . . . . . . : Broadcom 440x 10/100 Integrated Cont
roller
Physical Address. . . . . . . . . : 00-C0-9F-5F-8C-6C
Dhcp Enabled. . . . . . . . . . . : No
IP Address. . . . . . . . . . . . : 192.168.20.16
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 192.168.20.254
DNS Servers . . . . . . . . . . . : 192.168.6.8
192.168.6.9
D:\Documents and Settings\wang>
chmdcr 2009-07-24
  • 打赏
  • 举报
回复
在初始化里

m_strIp = GetIp(); //获得的IP为192.168.20.16
m_SystemInfo.AddNetCounter(m_strIp,"Bytes Received/sec");
m_SystemInfo.AddNetCounter(m_strIp,"Bytes Sent/sec");


在ontimer里

dw = m_SystemInfo.GetNetValue(m_strIp,"Bytes Received/sec");
m_strInfo.Format("%d",dw);
dw = m_SystemInfo.GetNetValue(m_strIp,"Bytes Sent/sec");
m_strTNet.Format("%s/%d",m_strInfo,dw);
SetDlgItemText(IDC_SNET,m_strTNet);


在我自己的机器上 输出值始终是-1/-1即使我用浏览器打开一个网页也不边也就是说在函数

//获取计数器的值
DWORD CSystemInfo::_GetCounterValue(const char * pszDesc)
{
PDH_FUNCTION re = 0;
re = PdhCollectQueryData(m_hQuery); //这里返回那个PDH_NO_DATA 所以直接return-1
if(ERROR_SUCCESS == re)
{
HCOUNTER *pCounter = _FindHCounter(pszDesc);
if (pCounter != NULL)
{
PDH_FMT_COUNTERVALUE szFmtValue={0};
DWORD dwCtrType;
if(ERROR_SUCCESS == PdhGetFormattedCounterValue(*pCounter,
PDH_FMT_DOUBLE, //PDH_FMT_LONG,
&dwCtrType,
&szFmtValue))
{
return (szFmtValue.doubleValue+0.5);
//return szFmtValue.longValue;
}
}
}
return -1;
}

在函数 re = PdhCollectQueryData(m_hQuery); //这里返回那个PDH_NO_DATA 所以直接return-1
可是在另外一台机器上 此处不会返回PDH_NO_DATA 而是返回ERROR_SUCCESS 取到的szFmtValue值为当前网络流动的值 偶尔为0 当我打开浏览器访问网页时数据会变化
rendao0563 2009-07-24
  • 打赏
  • 举报
回复
既PDH_NO_DATA 返回是合法的。 只是说明现在没有数据更新。 不代表下次调用也没有数据。
rendao0563 2009-07-24
  • 打赏
  • 举报
回复

PdhCollectQueryData
原型:
PDH_STATUSPdhCollectQueryData(
PDH_HQUERYhQuery
);
功能:
收集该查询在当前行的所有统计的信息,并更新所有统计。
参数:
hQuery
查询的句柄
返回值:
ERROR_SUCCESS
统计成功
PDH_INVALID_HANDLE
句柄非法
PDH_NO_DATA
没有一个统计有新的数据
rendao0563 2009-07-24
  • 打赏
  • 举报
回复
你代码怎么写的。发出来。错误码在那里。MSDN上面有。你不会定义了多个对象吧?
cmd下
ipconfig /all 把输出打上来。最好贴个全点的代码。
晨星 2009-07-24
  • 打赏
  • 举报
回复
你可以从“控制面板 -> 管理工具 -> 性能”这个工具中把那个counter的名字拷贝出来。不要自己写,别不小心少个空格啥的。
chmdcr 2009-07-24
  • 打赏
  • 举报
回复

从哪查的-2147481643这个返回值 的描述 ?

没用这个网卡我怎么上网? 再有这个网卡是通过IP从_GetAdaptersInfoByIP函数查出来的 不是我自己写上去的
rendao0563 2009-07-24
  • 打赏
  • 举报
回复
你瞎胡闹。-2147481643 错误码的是no data to return 意思就是你根本没用这个网卡通讯。还确定是中文问题。
chmdcr 2009-07-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 oyljerry 的回复:]
引用 10 楼 chmdcr 的回复:
工程不是UNICODE的

那你自己把字符串转换成unicode看看...然后调用AddCounter的unicode版本
[/Quote]

我试试 再
chmdcr 2009-07-24
  • 打赏
  • 举报
回复
现在可以确定是中文的问题了 我换台机器 那个网卡的描述里没有中文 就可以正确的执行
oyljerry 2009-07-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 chmdcr 的回复:]
工程不是UNICODE的
[/Quote]
那你自己把字符串转换成unicode看看...然后调用AddCounter的unicode版本
chmdcr 2009-07-24
  • 打赏
  • 举报
回复
工程不是UNICODE的
晨星 2009-07-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 chmdcr 的回复:]
我也很奇怪啊 那个网卡就是不行 返回一个很大的负数 换成(MS TCP Loopback interface)就没问题
[/Quote]
那要么是写错了,要么就很可能是汉字编码的问题了。
如果你的工程是UNICODE的,而源文件是多字节编码的,那你可以试试把一个char类型的汉字字符串使用mbstowcs转化成wchar_t类型的试试。
或者,不要写死成字符串常量,而是使用PdhEnumObjectItems来动态获得这个counter的名字。
加载更多回复(7)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧