请问如何获取这些系统信息?

hiei1125 2007-12-06 11:52:28
想获取以下参数:

处理器\处理器队列长度
磁盘(逻辑磁盘或物理磁盘)\% 磁盘时间
磁盘(逻辑磁盘或物理磁盘)\队列长度
磁盘(逻辑磁盘或物理磁盘)\平均磁盘字节/传输

请问是否有API可供直接调用?
谢谢了
...全文
149 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hiei1125 2007-12-10
  • 打赏
  • 举报
回复
刚刚查了一下2楼说的WMI,按说能取到系统中所有的资源信息,现在程序已经调通,等下午测试一下是否能获取到相应信息。
谢谢2楼了!
ydlchina 2007-12-10
  • 打赏
  • 举报
回复
up
hiei1125 2007-12-10
  • 打赏
  • 举报
回复
谢谢三楼,这些操作方法我也知道,但是现在想在程序中实现定期获取这些参数的功能。
如果有现成的API就好了。先谢谢你了,结贴的时候一起算分!
继续等待高手解答!
lixin1019 2007-12-10
  • 打赏
  • 举报
回复
这个貌似可以用管理工具--性能 里面可以查看的 不过这个方法是通过日志来查看的 不是即时信息
要做几个设置如下
1.在系统监视器中展开 系统日志和警报 节点,右击 计数器日志 ,选择 新建日志设置 。
  2.在 新建日志设置 对话框中输入新日志名称,单击 确定。
  3.如右图所示在新日志属性对话框的 常规 选项卡中单击 添加 打开计数器对话框,指定该日志文件记录的计数器,单击 确定 返回。
4.在 数据采样间隔 栏中指定计数器数据多久被采集一次,注意,过密的采集间隔会影响系统的正常工作并造成巨大的日志文件。
5.在 计划 选项卡中指定日志起止时间,可选的方式有:手动、指定起止时间或者指定记录时间。单击 确定 。
  6.如果选择手动起止日志,则在日志列表中右击日志,选择 开始 ,日志图标变为绿色。
系统监视器将计数器数据以blg文件的形式保存起来(缺省位置是系统分区的\PerfLogs目录下)。一旦开始记录,计数器数据被定期(按照采样间隔时间)加入日志文件,直到到达计划的日志结束时间或者手工停止日志记录。
SERVER版系统应该有你想要的那几个参数 2000 2003 server应该都有 XP就不知道了~~~呵呵~
hiei1125 2007-12-10
  • 打赏
  • 举报
回复
问题已解决,贴出代码:
LRESULT _getWmiInfo(IWbemClassObject *pClassObject)
{
SAFEARRAY *pvNames = NULL;
if( pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS |
WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK )
{
long vbl, vbu;
SafeArrayGetLBound(pvNames, 1, &vbl);
SafeArrayGetUBound(pvNames, 1, &vbu);
for(long i = vbl ; i<= vbu; i++ )
{
long index = i ;
WCHAR *wsName = NULL ;
CComVariant varValue ;
SafeArrayGetElement( pvNames, &index , &wsName ) ;
CComBSTR bstrName ( wsName ) ;
if( pClassObject->Get( bstrName , 0 , &varValue , NULL , 0 ) == S_OK )
{
CString str ;
if( varValue.vt & VT_BSTR )
{
str = varValue.bstrVal ;
}
else if( varValue.vt & VT_ARRAY )
{
long iLowBound = 0 , iUpBound = 0 ;
SafeArrayGetLBound( varValue.parray , 1 , &iLowBound ) ;
SafeArrayGetUBound( varValue.parray , 1 , &iUpBound ) ;
for( long j = iLowBound ; j <= iUpBound ; j ++ )
{
VARIANT *pvar = NULL ;
long temp = j ;
if( SafeArrayGetElement( varValue.parray , &temp , pvar ) == S_OK &&
pvar )
{
CComVariant varTemp ;
if( varTemp.ChangeType( VT_BSTR , pvar ) == S_OK )
{
if( !str.IsEmpty() )
str += _T(",");
str += varTemp.bstrVal ;
}
}
}
}
else
{
if( varValue.ChangeType( VT_BSTR ) == S_OK )
str = varValue.bstrVal ;
}

// 打印出硬件信息
printf("%s=%s\n" , CString(bstrName) , str ) ;
}
}
}

if(pvNames)
{
SafeArrayDestroy(pvNames);
return S_OK ;
}

return E_FAIL ;
}

HRESULT GetWmiInfo(LPCTSTR lpszClass)
{
CoInitialize(NULL);
//

// 获取访问 WMI 权限

//
if( CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT,
RPC_C_IMP_LEVEL_IMPERSONATE,NULL, EOAC_NONE, 0 )
== S_OK )
{
//
// 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息
//
CComPtr<IWbemLocator> spWbemLocator ;
if( spWbemLocator.CoCreateInstance( CLSID_WbemAdministrativeLocator , 0 ,
CLSCTX_INPROC_SERVER|
CLSCTX_LOCAL_SERVER ) == S_OK )
{
CComPtr<IWbemServices> spWbemServices ;
if( spWbemLocator->ConnectServer( L"root\\cimv2" , NULL, NULL, NULL, 0,
NULL, NULL, &spWbemServices ) == S_OK )
{
//
// 检索指定信息
//

USES_CONVERSION ;
CComPtr<IEnumWbemClassObject> spEnumWbemClassObject ;
CComBSTR bstrQuery ( L"Select * from " ) ;
bstrQuery += T2OLE(lpszClass) ;

if( spWbemServices->ExecQuery( L"WQL" , bstrQuery ,
WBEM_FLAG_RETURN_IMMEDIATELY ,
NULL, &spEnumWbemClassObject ) == S_OK )
{
ULONG uCount = 1, uReturned;
CComPtr<IWbemClassObject> spClassObject ;
if( spEnumWbemClassObject->Reset() == S_OK )
{
int iEnumIdx = 0;

while( spEnumWbemClassObject->Next( WBEM_INFINITE,
uCount, &spClassObject, &uReturned) == S_OK )
{
_getWmiInfo( spClassObject) ;
spClassObject.Release() ;
}

}
}
}
}
}

CoUninitialize();

return 1;
}

使用的就是通过WMI(windows 管理规范)查到的系统资源信息,使用HRESULT GetWmiInfo(LPCTSTR lpszClass)函数,参数为需要查询的性能指标。关于磁盘和cpu的性能指标使用的是Win32_PerfFormattedData_PerfDisk_PhysicalDisk和Win32_Processor。另外PerfFormattedData对应的还有PerfRawData,一个是格式化数据一个是原始数据,我用的是格式化的。

以上程序在Windows XP,Server2003上测试通过,也经过压力测试发现数据有效。现结贴,感谢上面兄弟的支持。
蒋晟 2007-12-10
  • 打赏
  • 举报
回复
WMI?
hiei1125 2007-12-10
  • 打赏
  • 举报
回复
http://www.cnblogs.com/Files/IceSharK/WMI.rar

这个是一个WMI查看器,我现在能获取到上面列出的所有参数,但是不知道哪个才是我想要的。

可能使用WMI并不能达到目的,我再查一下是否还能有别的渠道。
hiei1125 2007-12-06
  • 打赏
  • 举报
回复
再顶一下,请高手指教了!

6,849

社区成员

发帖
与我相关
我的任务
社区描述
Windows 2016/2012/2008/2003/2000/NT
社区管理员
  • Windows Server社区
  • qishine
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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