镀硬铬厂家:基于C++的WMI应用编程初探-读取BIOS信息
来源:百度文库 编辑:偶看新闻 时间:2024/03/29 21:32:42
虽然VBScript等脚本语言实现WMI编程更加方便,但有些时候我们还是不得不使用C++来编程,比如说要追求更好的性能或者是一个基于C++的项目中需要这样的功能等等。 下面是用C++实现WMI编程的基本步骤,在这里,我们通过读取BIOS信息来演示如何实现。可以对照参考:http://www.qingfengju.com/article.asp?id=60(通过一个具体实例来理解WMI脚本编程-读取BIOS信息)。 1.初始化COMWMI提供的API是基于COM的,所以必须首先执行CoInitializeEx 和 CoInitializeSecurity函数,以便访问WMI。 这里需要如下定义和头文件:#define _WIN32_DCOM#include #include #include #pragma comment(lib, "wbemuuid.lib") #include using namespace std; ·用CoInitializeEx函数初始化COM接口:HRESULT hr= CoInitializeEx(0,COINIT_MULTITHREADED); if (FAILED(hr)){ return FALSE;}注意这个FAILED 的定义是:
#define FAILED(hr) (((HRESULT)(hr)) < 0) ·用CoInitializeSecurity函数注册并设置进程的默认的安全值:hr= CoInitializeSecurity( NULL, // Security descriptor -1, // COM negotiates authentication service NULL, // Authentication services NULL, // Reserved RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication level for proxies RPC_C_IMP_LEVEL_IMPERSONATE,// Default Impersonation level for proxies NULL, // Authentication info EOAC_NONE, // Additional capabilities of the client or server NULL); // Reserved if (FAILED(hr)){ CoUninitialize(); return FALSE; } 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(); return FALSE; } ·用IWbemLocator::ConnectServer方法连接到WMIConnectServer方法返回一个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(); return FALSE; }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(); return FALSE; } 4.执行自己需要的操作WMI通过COM提供了许多用来访问系统数据的接口,这里我们要读取系统的BIOS信息。·用IWbemServices指针向WMI发送请求,获取Win32_BIOS类的实例集合IEnumWbemClassObject* pEnumerator = NULL;hr = pSvc->ExecQuery( bstr_t("WQL"), bstr_t("Select * FROM Win32_BIOS"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator ); if (FAILED(hr)){ pSvc->Release(); pLoc->Release(); CoUninitialize(); return FALSE;} ·遍历IEnumWbemClassObject,输出信息IWbemClassObject *pclsObj=NULL;while (pEnumerator){ ULONG uReturn = 0; hr = pEnumerator->Next( WBEM_INFINITE, 1, &pclsObj, &uReturn ); if(0 == uReturn) break; VARIANT vtProp; 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(); 在我的系统上的输出:
#define FAILED(hr) (((HRESULT)(hr)) < 0) ·用CoInitializeSecurity函数注册并设置进程的默认的安全值:hr= CoInitializeSecurity( NULL, // Security descriptor -1, // COM negotiates authentication service NULL, // Authentication services NULL, // Reserved RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication level for proxies RPC_C_IMP_LEVEL_IMPERSONATE,// Default Impersonation level for proxies NULL, // Authentication info EOAC_NONE, // Additional capabilities of the client or server NULL); // Reserved if (FAILED(hr)){ CoUninitialize(); return FALSE; } 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(); return FALSE; } ·用IWbemLocator::ConnectServer方法连接到WMIConnectServer方法返回一个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(); return FALSE; }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(); return FALSE; } 4.执行自己需要的操作WMI通过COM提供了许多用来访问系统数据的接口,这里我们要读取系统的BIOS信息。·用IWbemServices指针向WMI发送请求,获取Win32_BIOS类的实例集合IEnumWbemClassObject* pEnumerator = NULL;hr = pSvc->ExecQuery( bstr_t("WQL"), bstr_t("Select * FROM Win32_BIOS"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator ); if (FAILED(hr)){ pSvc->Release(); pLoc->Release(); CoUninitialize(); return FALSE;} ·遍历IEnumWbemClassObject,输出信息IWbemClassObject *pclsObj=NULL;while (pEnumerator){ ULONG uReturn = 0; hr = pEnumerator->Next( WBEM_INFINITE, 1, &pclsObj, &uReturn ); if(0 == uReturn) break; VARIANT vtProp; 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(); 在我的系统上的输出:
基于Windows的C编程是指什么意思?
WMI编程中遇到的问题?
基于WEB数据库的应用
Pd-Bi/C的制备
WINDOWS是基于什么编程语言做出来的?C吗?
怎么学好基于arm 嵌入式的编程
VC++中基于对话框的编程。
谁有基于com的matlab6.5与C++Builder6.0混合编程的实现书籍的下载
用C语言编程应用什么编绎器呀
学了C评语言,想学习API函数,请问API函数的编程环境是什么,网络上好多都是基于VB的API编程.谢谢!
wmi损坏的问题
哪里能下载《Visual C#.NET应用编程150例》的电子书呢
基于模糊AHP法的水质评价模型及其应用
特尔斐法(专家意见法)基于网络的应用
特尔斐法(即专家意见法)基于网络的应用
基于构件应用开发的优点有哪一些啊
讨论以下问题:基于Web应用的构件
基于SNMP++的阻塞模式收发应用研究
基于网络应用的设计服务都有哪些?
追问:powerbuild一般用于开发基于什么语言的应用?
VC中基于对话框的编程如何改变按钮显示?
VC中基于对话框的编程如何改变按钮显示?
VC中基于对话框的编程如何获得按钮标题?
VC中基于对话框的编程如何改变按钮位置?