C++通过WMI获取计算机电池电压的程序以及我出现的问题解决

2023-05-16

C++通过WMI获取计算机电池电压的程序以及我出现的问题解决
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
#include “stdafx.h”
#include “DXGI.h”
#include “vector”
#include <atlstr.h>
#include
//#include
#pragma comment(lib,“DXGI.lib”)

#define _WIN32_DCOM
#include <comdef.h>
#include <wbemidl.h>
#include <math.h>
*# pragma comment(lib, “wbemuuid.lib”)

using namespace std;

int Vmem(CString AdapterDesc);
int Dedicated_BatteryStatus=0;

int _tmain(int argc, _TCHAR* argv[])
{
//printf("\n argc:%d",argc); argc=1
IDXGIAdapter * pAdapter;
std::vector <IDXGIAdapter*> vAdapters;
IDXGIFactory* pFactory = NULL;
DXGI_ADAPTER_DESC desc;

if(FAILED(CreateDXGIFactory(__uuidof(IDXGIFactory) ,(void**)&pFactory))) //使用FAILED宏来对COM组件的返回值HRESULT进行判断,如果函数正常执行,则返回S_OK
{
	return 0;
}

for (UINT i = 0;pFactory->EnumAdapters(i, &pAdapter) != DXGI_ERROR_NOT_FOUND;++i )
{
	CString Description;
	pAdapter->GetDesc( &desc );  //类 类型的指针pAdapter访问类的成员GetDesc
	Description=(CString)desc.Description; 
	//printf_s(_T("11111111111"));
	Vmem(Description);
}
SYSTEM_POWER_STATUS sysPowerStatus;
GetSystemPowerStatus(&sysPowerStatus);
printf("\nPercentage of electricity:%d%%",(int)sysPowerStatus.BatteryLifePercent);
getchar();
//Sleep(1000);
return 0;

}
int Vmem(CString Description)
{
HRESULT hres;

// Initialize COM.
hres =  CoInitializeEx(0, COINIT_MULTITHREADED);   //CoInitializeEx是API函数,初始化COM库
if (FAILED(hres))       //使用FAILED宏来判断函数CoInitializeEx()函数的返回值。
{
    cout << ";;Failed to initialize COM library. " << "Error code = 0x" << hex << hres << endl;
    return 1;              // Program has failed.
}




// Initialize ,初始化
hres =  CoInitializeSecurity(     //注册安全性并设置进程的安全级别。
	NULL,        //COM生成允许任何人访问的SID
    -1,      // COM negotiates service ,COM来处理认证服务                  
    NULL,    // Authentication services,认证服务数组
    NULL,    // Reserved,保留
	
    RPC_C_AUTHN_LEVEL_DEFAULT,    // authentication,身份验证,代理的默认认证级别
    RPC_C_IMP_LEVEL_IMPERSONATE,  // Impersonation,代理的默认模拟级别
    NULL,             // Authentication info ,身份信息,认证信息
    EOAC_NONE,        // Additional capabilities,其他功能,客户端或者服务器的附加能力
    NULL              // Reserved,保留
    );
                  
if (FAILED(hres))//使用FAILED宏来判断函数CoInitializeSecurity()函数的返回值。
{
    cout << ";;Failed to initialize security. " << "Error code = 0x"  << hex << hres << endl;
    CoUninitialize();   //API函数,用来告诉 Windows以单线程的方式创建com对象
    return 1;          // Program has failed.安全初始化失败
}



// Obtain the initial locator to Windows Management,获得最初管理员的定位
// on a particular host computer,特定的主机上	
IWbemLocator*pLoc=NULL;        //?定位器
//CoCreateInstance初始化 IWbemLocator 接口
hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc); //用指定的类标识符CLSID_WbemLocator创建一个Com对象,用指定的类标识符创建一个未初始化的对象
if (FAILED(hres))  //使用FAILED宏来判断函数CoCreateInstance()函数的返回值。
{
    cout << ";;Failed to create IWbemLocator object. "<< "Error code = 0x"<< hex << hres << endl; //创建IWbemLocator失败
    CoUninitialize();
    return 1;       // Program has failed.创建IWbemLocator失败
}


IWbemServices *pSvc = NULL;    // ?用于连接WMI
// Connect to the root\cimv2 namespace with the,连接root\cimv2
// current user and obtain pointer pSvc,获取用户信息和pSvc指针
// to make IWbemServices calls. 定义IWbemServices
hres = pLoc->ConnectServer(         //获得指定计算机上root\cimv2命名空间上的IwbemService对象的指针,连接到WMI
    _bstr_t(L"ROOT\\CIMV2"), // WMI namespace
    NULL,                    // User name ,用户名
    NULL,                    // User password,密码
    0,                       // Locale,地域
    NULL,                    // Security flags,安全标识                
    0,                       // Authority  ,权威    
    0,                       // Context object,上下文对象
    &pSvc                    // IWbemServices proxy,指向IWbemServices代理的指针
    );                                  
if (FAILED(hres))
{
    cout << ";;Could not connect. Error code = 0x" << hex << hres << endl;
    pLoc->Release();     
    CoUninitialize();
    return 1;                // Program has failed.连接失败
}

// cout << “Connected to ROOT\CIMV2 WMI namespace” << endl;

// Set the IWbemServices proxy so that impersonation,设置IWbemServices代理以便于模拟
// of the user (client) occurs.用户或者客人身份

//设置WMI连接的安全性级别
//
hres = CoSetProxyBlanket( //设置代理信息

   pSvc,                         // the proxy to set,设置代理
   RPC_C_AUTHN_WINNT,            // authentication service,身份认证
   RPC_C_AUTHZ_NONE,             // authorization service,授权
   NULL,                         // Server principal name,服务器名称
   RPC_C_AUTHN_LEVEL_CALL,       // authentication level,认证级别1
   RPC_C_IMP_LEVEL_IMPERSONATE,  // impersonation level,模拟级别1
   NULL,                         // client identity ,客户身份
   EOAC_NONE                     // proxy capabilities ,代理功能
);
if (FAILED(hres))
{
    cout << ";;Could not set proxy blanket. Error code = 0x" << hex << hres << endl; 
    pSvc->Release();    //原始指针的释放功能,若不释放,资源容易泄露
    pLoc->Release();     
    CoUninitialize();
    return 1;               // Program has failed.设置代理失败
}




// Use the IWbemServices pointer to make requests of WMI., 用这个指针对WMI提出请求
// Make requests here:

// For example, query for all the running processes ,查找所有正在运行的进程
IEnumWbemClassObject* pEnumerator = NULL;
hres = pSvc->ExecQuery(bstr_t("WQL"), bstr_t("SELECT * FROM Win32_Battery"),WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL,&pEnumerator); //查询有效的电池信息
if (FAILED(hres))
{
    cout << ";;Query failed. "<< "Error code = 0x" << hex << hres << endl;
    pSvc->Release();
    pLoc->Release();     
    CoUninitialize();
    return 1;               // Program has failed.查询失败
}
else
{ 
	IWbemClassObject *pclsObj=NULL;
	ULONG uReturn = 0;
	

	while (pEnumerator)
	{
       
       hres = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);  //Next函数

        if((0 == uReturn)||(0 == pclsObj))
       // if(0 == uReturn)

        {
            break;
        }
        
		//获取字段的值
		VARIANT vtProp;
		VARIANT vtPropDesc;
		//VARIANT vtPropCap;
		VARIANT vtPropDesig;
		VARIANT vtPropChemi;
		VARIANT vtPropEstima;
		vtProp.bstrVal=0;
		vtPropDesc.bstrVal=0;
		vtPropDesig.bstrVal=0;

		pclsObj->Get(L"BatteryStatus",0,&vtProp,0,0);			
		printf("\n BatteryStatus:%d",vtProp.bVal);

	    pclsObj->Get(L"Description",0,&vtPropDesc, 0, 0);				
		printf("\n Description:%s",(CString)vtPropDesc.bstrVal);
		
		pclsObj->Get(L"DesignVoltage", 0, &vtPropDesig, 0, 0);	
		printf("\n DesignVoltage:%ls",vtPropDesig.bstrVal);

		pclsObj->Get(L"Availability",0,&vtPropChemi, 0, 0);
		printf("\n Availability:%d",vtPropChemi.bVal);
		pclsObj->Get(L"EstimatedRunTime",0,&vtPropEstima, 0, 0);
		printf("\n EstimatedRunTime:%d",vtPropEstima.bstrVal);

		VariantClear(&vtProp);
		VariantClear(&vtPropDesc);
		VariantClear(&vtPropDesig);
		VariantClear(&vtPropChemi);
		VariantClear(&vtPropEstima);

		pclsObj->Release();
		}   
}

// Cleanup
// ========释放资源
pSvc->Release();
pLoc->Release(); 

//pEnumerator->Release(); 
CoUninitialize();

//getchar();

return 0;   // Program successfully completed.

}

问题一:刚开始我不懂这个程序的意思,其实关于计算机电池的信息已经在wmi上面,现在只不过是要把信息从wmi上面读下来而已。
问题二:前面一长串的东西一个一个搜了但是还是不知道在说啥,其实那些都是连接wmi的准备工作。如初始化com库的函数CoInitializeEx这些的,这些网上的都很多,我就不多说了!
问题三:我的电压一直出不来正确的值,从命令行运行.exe文件,直接双击.exe文件和VS里运行程序得到的结果都不一样,没有一个是对的!我的程序的问题在于printf("\n DesignVoltage:%d",vtPropDesig.bstrVal);这一句话,后面的vtPropDesig.boolVal是wchar_t宽字符型的,但是我的输出是窄字符型的。解决方法把%d改成%ls就行了。如果还不一样的话可以看看你的vs是不是管理员权限运行的;检查你的属性里的字符集,最好改成多字符集;还有一点就是看看你的电脑的电池是否正常并且电脑如果在充电的时候电压和wmi中的电压值有一点差异

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++通过WMI获取计算机电池电压的程序以及我出现的问题解决 的相关文章

  • 使用 WMI 挂载网络驱动器

    尝试编写 WMI 类函数以使用登录计算机的凭据在任何计算机 远程或本地 上安装网络驱动器 这是我为服务台工作人员编写的一个较大项目的类 用于在远程 PC 上进行一线修复 技术人员输入机器名称或 IP 地址 应用程序会连接到它 并允许技术人员
  • x64 上的 WMI 链接器错误

    我正在尝试使用 msdn 中的 WMI 示例 http msdn microsoft com en us library windows desktop aa384724 28v vs 85 29 aspx http msdn micros
  • 以编程方式从配置数据库 IIS6 中删除 etag 后缀(更改编号)

    IIS 6 0 以 hash changenumber 格式生成 eTag 值 每次 IIS 重置时 更改编号都会增加 因此您的 eTag 仅在 IIS 进程的生命周期内有效 重启 number上升 hash changenumber ha
  • Invoke-Command 和直接查询的区别

    我目前正在编写一个从服务器查询磁盘信息的脚本 我遇到了一个问题 我真的不知道这里发生了什么 愿你能帮助我 以下代码有效 已替换 ComputerName space1 Invoke Command ComputerName xxxxxx S
  • WMI 逻辑磁盘与磁盘分区的关联

    我正在尝试整理一个列表 其中显示我的计算机系统中的所有 LogicalDisk 实例以及它们关联的驱动器号 编码采用 C WMI 类Win32 LogicalDisk分区 Win32 磁盘分区 and Win32 逻辑磁盘似乎是完成这项工作
  • 查询 WMI 类 Win32_QuickFixEngineering 返回很多奇怪的时间戳 (C#)

    类文档here http msdn microsoft com en us library aa394391 VS 85 aspx InstalledOn 属性应该具有安装修复程序时的时间戳 好吧 废话 但文档没有说明格式是什么 我得到一些
  • 硬盘序列号可以/为什么会改变

    我们的反盗版软件根据硬盘序列号来识别人员 我相信这是一个恒定的功能 除非用户更改其主要物理驱动器 否则不会改变 如果我错了 请纠正我 我们使用WMIpython模块获取用户的硬盘序列号 我们的 2 台测试计算机的硬盘序列号已更改 但我们根本
  • Screen.AllScreens 错误并将 WM_DISPLAYCHANGE 发布到单个 WinForm 应用程序

    首先 对这么长的帖子表示抱歉 关于如何限制 WM DISPLAYCHANGE 消息的发布范围有什么建议吗 设想 Screen AllScreens返回在客户端上检测到的所有监视器的坐标和分辨率的数组 如果在工作站锁定时启动应用程序 在夜间应
  • 我可以使用 WMI 来管理 WSD 设备(特别是打印机)吗?

    我使用 WMI 和 C 来枚举和修改计算机上的打印机 我运行的是 Windows 7 当我尝试修改 经典 安装的打印机时 一切工作正常 我所说的 经典 是指打印机仅使用基本的 TCP IP 端口 我可以使用此处记录的 WMI 函数重命名它
  • Visual Studio 服务器资源管理器中缺少管理类

    我在 Visual Studio 2015 专业版 64 位 中遇到问题 在我的服务器资源管理器中 我连接到本地主机 我可以看到 事件日志 消息队列 性能计数器 Services 我在这里似乎怀念的是管理课程 在我以前的电脑 VS2013
  • 使用 C# 远程更改 Windows Server 2008 计算机的计算机名称?

    也许有人能够向我指出一个决定性的资源 以了解如何使用 C 在 Windows Server 2008 计算机上远程更改计算机名称 我已经查看了很多网站寻求帮助 现在在我的任务的第二天 并没有真正接近 除了决定 WMI 几乎是我唯一的选择 完
  • WMI 调用获取驱动程序

    我是 WMI 的新手 它是什么 例如 我可以在 C 中使用 WMI 调用来获取我的 PC 上的驱动程序列表吗 如果是这样 我该打电话给哪个班级 要列出已安装的驱动程序 您可以使用Win32 PnPSignedDriver http msdn
  • 使用 PowerShell 回收 IIS 应用程序池:“调用回收时出现异常”

    看起来最近的 Windows 更新破坏了我用来回收 IIS6 应用程序池的一些功能 因为到目前为止这已经工作了几个月 Exception calling Recycle Win32 The object identifier does no
  • 检索 WMI Win32_Processor.Family 属性的描述性值而不是索引

    下面的简单 VBS 示例从 WMI 检索 CPU 标题 体系结构和系列 s For Each Item In GetObject winmgmts impersonationLevel impersonate Root CIMV2 Inst
  • WMI 与 Windows API

    使用该方法有任何优点或缺点WMI http msdn microsoft com en us library aa394582 28VS 85 29 aspx代替视窗应用程序接口 http msdn microsoft com en us
  • 在远程计算机上运行命令

    我想使用 C 在远程计算机上的命令提示符中运行命令 根据此链接如何在远程计算机上执行命令 https stackoverflow com questions 428276 how to execute a command in a remo
  • 是否有必要将每个 ManagementObject 都处理掉?

    我注意到ManagementObject is IDisposable 但它也是从ManagementClass GetInstances and ManagementObjectSearcher Get 这是否意味着我需要处理遇到的每个对
  • 如何删除已发布的 wmi 架构?

    我已经发布了架构 并且不再拥有包含发布该架构的 wmi 提供程序的 dll 如何删除架构 如果您正在谈论其他问题中的程序集 您可以简单地使用 wbemtest exe 连接到根命名空间 枚举实例 按钮 超类 名称 命名空间 删除名为 Tes
  • 如何在 Windows 中为高级网络适配器属性设置巨型数据包和接收/传输缓冲区?

    我正在尝试为网络适配器设置一些高级属性 例如巨型数据包 接收 发送缓冲区 我尝试使用 Win32 NetworkAdapter Win32 NetworkConnection Win32 NetworkAdapterConfiguratio
  • 无法获得 S.M.A.R.T.外部驱动器的信息

    我正在尝试获取外部 USB 驱动器的 SMART 信息 我使用以下查询来获取驱动器的温度 但是该查询始终返回集合中的单个对象 即我的内部 HDD ManagementObjectSearcher searcher new Managemen

随机推荐

  • IDEA设置代码规范,代码格式化设置,以及ALIBABA编码规约

    阿里巴巴格式化模板文件下载地址 https github com alibaba p3c 第一个文件是 代码格式化时用的模板 第二个文件是 注释模板 一 eclipse 格式化设置 格式化模板导入 依次点击 xff1a Window gt
  • 数组的初始化 array initializer is not allowed here

    此处不允许使用数组初始值设定项 array initializer is not allowed here 数组的使用分声明和初始化两部分 xff0c 两者可同时进行 xff0c 也可分开进行 int array 声明 array 61 n
  • Maven打包所有依赖到一个可执行jar中,将外部依赖加入到classPath中

    首先说一下比较常用的两种打包方式 xff1a 前提 xff1a maven构建可执行jar包时 xff0c 如果项目依赖了pom中定义的dependency之外的外部jar包 xff0c maven jar plugin默认是不会把这 些额
  • postgresql数据库|数据库实操----表复制详解

    前言 xff1a 通常情况下 xff0c 我们对数据库的增删改查的时候 xff0c 为了确保数据的安全 xff0c 需要备份表 xff0c 那么 xff0c 一种方法是通过pg dump 这个工具做SQL转储操作 xff0c 此方法比较复杂
  • Centos7 配置防火墙 firewall

    一 firewall 1 从CentOS7开始 xff0c 默认使用firewall来配置防火墙 xff0c 没有安装iptables xff08 旧版默认安装 xff09 2 firewall的配置文件是以xml的格式 xff0c 存储在
  • Windows多媒体开发框架介绍

    Windows 多媒体开发框架介绍 欢迎来到 Windows 的多媒体开发世界2D 绘图 API1 GDI2 GDI 43 3 Direct2D 音频 API1 MME2 DirectSound3 Windows Core AudioCor
  • 【Ubuntu】在QT运行程序后无结果显示,只有终端运行的解决办法

    转自 http stackoverflow com questions 3255035 qt creator run in terminal https bugs launchpad net ubuntu 43 source qtcreat
  • 【蓝桥杯嵌入式】关于CT117E下载程序出问题解决方案(含keil mdk4和keil mdk5移植)

    废话 万事开头难 xff0c 然后中间难 xff0c 最后难 寒假刚开始 xff0c 我看到了蓝桥杯嵌入式 很快啊 xff01 报名 买板一气呵成 没想到这块CT117E板子它不讲武德 xff0c 来骗 xff0c 来偷袭我这个二十岁的小伙
  • c语言冒泡排序详解(分析每一步,附代码)

    冒泡排序 xff08 Bubble Sort xff09 xff0c 是一种计算机科学领域的较简单的排序算法 它重复地走访过要排序的元素列 xff0c 依次比较两个相邻的元素 xff0c 如果顺序 xff08 如从大到小 首字母从Z到A x
  • 解决maven update project 后项目jdk变成1.5

    一 问题描述 在Eclipse中新建了一个Maven工程 然后更改JDK版本为1 7 结果每次使用Maven gt Update project的时候JDK版本都恢复成1 5 二 原因分析 Maven官方文档有如下描述 xff1a 编译器插
  • C语言——整型和浮点型混合运算

    1 int和double混合运算 C语言int和double混合运算时 xff0c 会自动将int类型的数据转换为double类型的数据 xff0c 最后得到的结果也是double类型 如下例 xff1a double a 61 4 0 9
  • C语言——函数指针

    目录 1 函数指针概念 1 1 函数指针的声明 1 2 函数指针的定义 1 3 使用typedef定义函数指针的别名 1 4 将常数转换为函数指针 1 5 函数指针的调用 1 6 将函数指针作为函数的传入参数 2 简单的例子 1 函数指针概
  • C语言——多线程基础(pthread)

    目录 1 线程的定义以及线程的创建 1 1 线程和进程的概念 1 2 使用pthread create 函数创建进程 2 使用pthread join 等待线程结束 2 1 使用pthread join 等待线程结束 2 1 使用pthre
  • C++——双端队列(deque)

    1 双端队列 xff08 deque xff09 双端队列 xff08 deque xff09 是队列的一种变形 xff0c 一般队列只能在队尾添加元素 xff08 push xff09 xff0c 在队首删除元素 xff08 pop xf
  • Linux|集群初始化脚本--osiniit.sh简介

    前言 xff1a 不管是什么部署 xff0c 前期的准备工作通常都是比较繁琐的 xff0c 但同时这些工作又具有程式化的特征 xff0c 也就是说都是有一定的流程的 xff0c 固定的步骤的 OK xff0c shell脚本处理这样的程式问
  • C++——优先级队列(priority_queue)

    目录 1 优先级队列 xff08 priority queue xff09 1 1 基本概念 1 2 优先级队列的定义 1 3 通过重写仿函数来支持自定义数据类型 1 4 通过运算符重载来支持自定义比较函数 1 5 优先级队列的基本操作 2
  • 操作系统——进程状态

    进程从创建到执行 xff0c 再到执行完毕销毁的过程中 xff0c 经历了不同的进程状态 xff0c 进程状态部分取决于进程当前的活动 xff0c 可以将进程状态分为 xff08 1 xff09 三状态模型 xff1b xff08 2 xf
  • 操作系统——进程调度

    目录 1 基本概念 1 1 CPU I O执行周期 1 2 CPU调度程序 xff08 CPU scheduler xff09 1 3 进程状态模型 1 4 抢占调度 1 5 调度程序 xff08 dispatcher xff09 1 6
  • C++实现优先级队列模板类

    1 优先级队列 1 1 基本原理 仿照C 43 43 STL 中的优先级队列priority queue xff0c 主要实现以下功能 xff1a 向队列中添加元素后 xff0c 队列自动调整 xff0c 保证队列中优先级最高的元素在队列头
  • C++通过WMI获取计算机电池电压的程序以及我出现的问题解决

    C 43 43 通过WMI获取计算机电池电压的程序以及我出现的问题解决 ConsoleApplication1 cpp 定义控制台应用程序的入口点 include stdafx h include DXGI h include vector