发布网友 发布时间:2022-04-19 00:20
共1个回答
热心网友 时间:2022-04-19 01:49
C++ Builder 通过 WMI 获取系统信息 本文来自: www.dezai.cn 德仔工作室 http://www.dezai.cn/Channel/Web/ArticleShow.Aspx?AI=26702 WMI: Windows Management Instrumentation (Windows 管理工具) 通过 WMI 可以获取主板、BIOS、磁盘、显卡、网络等几乎所有的系统信息。 利用这个工具可以管理本地或客户端系统中几乎所有的信息。 很多网络管理工具都是基于WMI开发的。在 Windows NT/2000/XP/2003 都有这个工具, 在 Windows 98 里面可以选择安装这个工具。 ① 初始化 COM 接口: 访问 WMI, 必须先初始化 COM 接口, 在程序的一开始调用 CoInitialize(NULL); 初始化, 在结束时调用 CoUninitialize(); 释放资源。 这两个函数在 #include 里面定义。② 获取访问 WMI 权限: CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0); 如果这个函数返回 S_OK 获取权限成功, 否则为失败。字串4③ 通过 IWbemLocator 和 IWbemServices 这两个 COM 接口访问 WMI, 获取系统信息: 这个函数的参数: lpList 返回信息, wsClass 为要查找的系统信息类, 这些 COM 接口在 #include 里定义。void GetWmiInfo(TStrings *lpList, WideString wsClass){ IWbemLocator *pWbemLocator = NULL; if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK) { IWbemServices *pWbemServices = NULL; WideString wsNamespace = (L"root\\cimv2"); if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK) { IEnumWbemClassObject *pEnumClassObject = NULL; 字串4 WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass; if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK) { IWbemClassObject *pClassObject = NULL; ULONG uCount = 1, uReturned; if(pEnumClassObject->Reset() == S_OK) { int iEnumIdx = 0; while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK) 字串8本文来自: www.dezai.cn 德仔工作室 http://www.dezai.cn/Channel/Web/ArticleShow.Aspx?AI=26702