基于C++的WMI应用编程初探-读取BIOS信息
2012-12-27 16:45
579 查看
http://www.qingfengju.com/article.asp?id=62
虽然VBScript等脚本语言实现WMI编程更加方便,但有些时候我们还是不得不使用C++来编程,比如说要追求更好的性能或者是一个基于C++的项目中需要这样的功能等等。
下面是用C++实现WMI编程的基本步骤,在这里,我们通过读取BIOS信息来演示如何实现。可以对照参考:http://www.qingfengju.com/article.asp?id=60(通过一个具体实例来理解WMI脚本编程-读取BIOS信息)。
1.初始化COM
WMI提供的API是基于COM的,所以必须首先执行CoInitializeEx和CoInitializeSecurity函数,以便访问WMI。
这里需要如下定义和头文件:
#define_WIN32_DCOM
#include<windows.h>
#include<comdef.h>
#include<wbemidl.h>
#pragmacomment(lib,"wbemuuid.lib")
#include<iostream>
usingnamespacestd;
·用CoInitializeEx函数初始化COM接口:
HRESULThr=CoInitializeEx(0,COINIT_MULTITHREADED);
if(FAILED(hr))
{
returnFALSE;
}
注意这个FAILED的定义是:
#defineFAILED(hr)(((HRESULT)(hr))<0)
·用CoInitializeSecurity函数注册并设置进程的默认的安全值:
hr=CoInitializeSecurity(
NULL,//Securitydescriptor
-1,//COMnegotiatesauthenticationservice
NULL,//Authenticationservices
NULL,//Reserved
RPC_C_AUTHN_LEVEL_DEFAULT,//Defaultauthenticationlevelforproxies
RPC_C_IMP_LEVEL_IMPERSONATE,//DefaultImpersonationlevelforproxies
NULL,//Authenticationinfo
EOAC_NONE,//Additionalcapabilitiesoftheclientorserver
NULL);//Reserved
if(FAILED(hr))
{
CoUninitialize();
returnFALSE;
}
2.创建一个到WMI命名空间的连接
WMI并不是运行在我们自己的进程中,需要在WMI和我们的程序中创建一个连接。
·用CoCreateInstance函数来初始化IwbemLocator接口
IWbemLocator*pLoc=0;
hr=CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator,
(LPVOID*)&pLoc
);
if(FAILED(hr))
{
CoUninitialize();
returnFALSE;
}
·用IWbemLocator::ConnectServer方法连接到WMI
ConnectServer方法返回一个IWbemServices接口的代理,可以用来访问本地或是远程WMI命名空间。
IWbemServices*pSvc=0;
hr=pLoc->ConnectServer(
BSTR(L"root\\CIMV2"),
NULL,
NULL,
0,
NULL,
0,
0,
&pSvc
);
if(FAILED(hr))
{
pLoc->Release();
CoUninitialize();
returnFALSE;
}
3.设置WMI连接的安全属性
因为IWbemServices代理允许使用进程外对象,但是在COM中,如果没有设置安全属性,是不允许进程间互相访问的。所以需要用CoSetProxyBlanket函数设置IWbemServices代理的安全值。
hr=CoSetProxyBlanket(
pSvc,
RPC_C_AUTHN_WINNT,
RPC_C_AUTHZ_NONE,
NULL,
RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE
);
if(FAILED(hr))
{
pSvc->Release();
pLoc->Release();
CoUninitialize();
returnFALSE;
}
4.执行自己需要的操作
WMI通过COM提供了许多用来访问系统数据的接口,这里我们要读取系统的BIOS信息。
·用IWbemServices指针向WMI发送请求,获取Win32_BIOS类的实例集合
IEnumWbemClassObject*pEnumerator=NULL;
hr=pSvc->ExecQuery(
bstr_t("WQL"),
bstr_t("Select*FROMWin32_BIOS"),
WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator
);
if(FAILED(hr))
{
pSvc->Release();
pLoc->Release();
CoUninitialize();
returnFALSE;
}
·遍历IEnumWbemClassObject,输出信息
IWbemClassObject*pclsObj=NULL;
while(pEnumerator)
{
ULONGuReturn=0;
hr=pEnumerator->Next(
WBEM_INFINITE,
1,
&pclsObj,
&uReturn
);
if(0==uReturn)
break;
VARIANTvtProp;
hr=pclsObj->Get(L"Name",0,&vtProp,0,0);
wcout<<vtProp.bstrVal<<endl;
hr=pclsObj->Get(L"Manufacturer",0,&vtProp,0,0);
wcout<<vtProp.bstrVal<<endl;
hr=pclsObj->Get(L"Version",0,&vtProp,0,0);
wcout<<vtProp.bstrVal<<endl;
hr=pclsObj->Get(L"CurrentLanguage",0,&vtProp,0,0);
wcout<<vtProp.bstrVal<<endl;
VariantClear(&vtProp);
}
if(pclsObj!=NULL){
pclsObj->Release();
}
if(pEnumerator!=NULL){
pEnumerator->Release();
}
5.释放资源
pSvc->Release();
pLoc->Release();
CoUninitialize();
在我的系统上的输出:
相关文章推荐
- C++读取BIOS信息
- 基于visual c++之windows核心编程代码分析(62)读取本地已登录的QQ号及应用代码
- 基于visual c++之windows核心编程代码分析(62)读取本地已登录的QQ号及应用代码
- 基于visual c++之windows核心编程代码分析(62)读取本地已登录的QQ号及应用代码
- MASM32编程通过WMI获取BIOS、主板、硬盘、CPU、网卡的信息
- 基于Android的短信应用开发(五)——读取显示会话信息记录
- windows平台下,c++获取cpu型号,读取注册表获取系统软硬件信息代码
- C/C++通过WMI和系统API函数获取获取系统硬件配置信息
- linux c/c++ 编程之-----linux C/C++ 编程初探
- 基于Mschart的数据库图表应用编程
- 基于 OAuth 安全协议的 Java 应用编程
- Android编程实现应用获取包名、版本号、权限等信息的方法
- 基于 OAuth 安全协议的 Java 应用编程
- CC++初学者编程教程(15) 基于cocos2dx的安卓打包环境
- 汇编语言通过WMI获取BIOS、主板、硬盘、CPU、网卡的信息
- ASP.NET应用下基于SessionState的“状态编程框架”解决方案
- java JDBC编程——从属性文件读取信息,并创建到数据库的连接
- Windows 读取BIOS信息
- ASP.NET AJAX客户端编程之旅(四)——以组件的思想开发Ajax应用:客户端组件初探
- 编程乐趣:C#实现读取12306余票信息