
VC++代码实现电脑磁盘及设备信息获取
下载需积分: 34 | 30KB |
更新于2025-01-25
| 182 浏览量 | 举报
收藏
在计算机系统中,获取磁盘信息是系统管理员和开发者经常需要进行的一项任务。这可以帮助了解磁盘的健康状况、存储容量、分区信息等。本篇内容将详细解释如何使用VC++(Visual C++)编程语言获取电脑的磁盘、设备以及硬盘的相关信息。
### 知识点一:磁盘信息获取
磁盘信息包括磁盘的基本属性,如磁盘类型(HDD或SSD)、序列号、总容量、已用容量、可用容量、文件系统类型等。在Windows系统中,可以通过Windows Management Instrumentation(WMI)或调用系统API接口来获取这些信息。
#### Windows API 获取磁盘信息
在VC++中,可以使用Windows API中的`GetDiskFreeSpaceEx`、`GetDriveType`等函数获取磁盘空间信息和磁盘类型。
```cpp
#include <windows.h>
#include <iostream>
int main() {
ULARGE_INTEGER freeBytesAvailableToCaller, totalBytes, freeBytes;
if (GetDiskFreeSpaceEx(_T("C:\\"), &freeBytesAvailableToCaller, &totalBytes, &freeBytes)) {
std::wcout << L"总容量: " << totalBytes.QuadPart / (1024 * 1024 * 1024) << L" GB\n";
std::wcout << L"已用容量: " << (totalBytes.QuadPart - freeBytesAvailableToCaller.QuadPart) / (1024 * 1024 * 1024) << L" GB\n";
std::wcout << L"可用容量: " << freeBytesAvailableToCaller.QuadPart / (1024 * 1024 * 1024) << L" GB\n";
} else {
std::wcerr << L"获取磁盘空间信息失败!\n";
}
return 0;
}
```
### 知识点二:设备信息获取
设备信息主要是指硬件设备的详细情况,例如设备的描述、状态、驱动程序信息、硬件ID等。WMI是一种强大的方式,它允许你查询和控制本地和远程计算机上的硬件和操作系统信息。
#### 使用 WMI 获取设备信息
通过WMI,可以编写一个查询来获取系统上所有磁盘驱动器的相关信息。
```cpp
#include <iostream>
#include <wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
int main() {
HRESULT hres;
// 初始化COM库
hres = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hres)) {
std::cerr << "Failed to initialize COM library. Error code = 0x" << std::hex << hres << std::endl;
return 1; // 发生严重的错误
}
// 设置COM安全级别
hres = CoInitializeSecurity(
NULL,
-1, // COM 访问权限
NULL, // 认证服务
NULL, // 完全委托
RPC_C_AUTHN_LEVEL_DEFAULT, // 默认认证
RPC_C_IMP_LEVEL_IMPERSONATE, // 默认模拟
NULL, // 授权服务
EOAC_NONE, // 访问控制要求
NULL // 保留
);
if (FAILED(hres)) {
std::cerr << "Failed to initialize security. Error code = 0x" << std::hex << hres << std::endl;
CoUninitialize();
return 1; // 发生严重的错误
}
// 获取WMI接口
IWbemLocator *pLocator = NULL;
hres = CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator,
(LPVOID *)&pLocator);
if (FAILED(hres)) {
std::cerr << "Failed to create IWbemLocator object. Err code = 0x" << std::hex << hres << std::endl;
CoUninitialize();
return 1; // 发生严重的错误
}
// 连接到WMI
IWbemServices *pSvc = NULL;
hres = pLocator->ConnectServer(
_bstr_t(L"ROOT\\CIMV2"), // WMI命名空间
NULL, // 用户名
NULL, // 密码
0, // 本地计算机
0, // 使用当前的连接
0, // 没有代理
0, // 没有本地化
&pSvc // IWbemServices代理
);
if (FAILED(hres)) {
std::cerr << "Could not connect. Error code = 0x" << std::hex << hres << std::endl;
pLocator->Release();
CoUninitialize();
return 1; // 发生严重的错误
}
std::cout << "Connected to ROOT\\CIMV2 WMI namespace" << std::endl;
// 设置代理以进行WMI调用
hres = CoSetProxyBlanket(
pSvc, // 指定代理
RPC_C_AUTHN_WINNT, // 认证服务
RPC_C_AUTHZ_NONE, // 授权服务
NULL, // 服务器主体名称
RPC_C_AUTHN_LEVEL_CALL, // 认证级别
RPC_C ImpLevel_IMPERSONATE, // 模拟级别
NULL, // 客户端身份
EOAC_NONE // 客户端能力
);
if (FAILED(hres)) {
std::cerr << "Could not set proxy blanket. Error code = 0x" << std::hex << hres << std::endl;
pSvc->Release();
pLocator->Release();
CoUninitialize();
return 1; // 发生严重的错误
}
// 查询所有磁盘驱动器信息
IEnumWbemClassObject* pEnumerator = NULL;
hres = pSvc->ExecQuery(
bstr_t("WQL"),
bstr_t("SELECT * FROM Win32_DiskDrive"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);
if (FAILED(hres)) {
std::cerr << "Query for operating system name failed. Error code = 0x" << std::hex << hres << std::endl;
pSvc->Release();
pLocator->Release();
CoUninitialize();
return 1; // 发生严重的错误
}
// 获取设备信息
IWbemClassObject *pclsObj;
ULONG uReturn = 0;
while (pEnumerator) {
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
if (0 == uReturn) {
break;
}
VARIANT vtProp;
// 获取设备的序列号等信息
hr = pclsObj->Get(L"DeviceID", 0, &vtProp, 0, 0);
wprintf(L"Disk DeviceID: %s\n", vtProp.bstrVal);
VariantClear(&vtProp);
pclsObj->Release();
}
// 清理
pSvc->Release();
pLocator->Release();
pEnumerator->Release();
CoUninitialize();
return 0; // 成功
}
```
### 知识点三:硬盘信息获取
硬盘信息可能包括但不限于硬盘的型号、序列号、固件版本、接口类型、转速、缓存大小等。使用WMI可以查询到这些详细信息。
#### WMI 查询硬盘信息
通过WMI,可以得到硬盘的详细属性。这里我们以查询硬盘的序列号为例。
```cpp
IWbemClassObject *pclsObj;
ULONG uReturn = 0;
VARIANT vtProp;
hres = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
if (0 == uReturn) {
break;
}
// 获取硬盘的序列号
hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0);
if (SUCCEEDED(hr)) {
wprintf(L"Serial Number : %s\n", vtProp.bstrVal);
} else {
wprintf(L"Couldn't get Serial Number\n");
}
VariantClear(&vtProp);
pclsObj->Release();
```
### 结论
通过上述代码示例,我们可以看到如何使用VC++结合Windows API和WMI来获取电脑磁盘、设备以及硬盘的相关信息。了解这些技术细节对于开发人员来说至关重要,可以帮助他们编写出能够检测系统硬件状态的应用程序,对于系统维护和故障诊断也大有裨益。需要注意的是,实际使用时还需对COM初始化和清理代码进行适当修改,以适应不同开发环境和确保资源正确释放。
相关推荐








jojojozhi
- 粉丝: 5
最新资源
- 兼容性极强的JavaScript日历代码实现
- 深入解析计算机组成原理课件精要
- 24位彩色图像VC程序处理与说明解析
- 《计算机图形学原理及算法教程》源代码分析
- 免费下载的超市POS收银系统软件介绍
- C#开发的个人汇款管理系统及学习工具
- VB编程实现Label控件立体字显示教程
- VB6.0中文标准版精简:资源受限者的编程好帮手
- 人力资源管理全套文件:招聘、培训、绩效与薪酬指南
- C语言数据结构课件及练习解析
- Lucene 2.3版本Java开发包详解
- 基于JSP实现的基础在线购物系统开发
- 深入IBM架构设计方法与架构师职业发展
- SAP权限对象创建及ABAP代码应用指南
- 硬件组装教学PPT,教师授课必备
- 模拟电路原理与应用电子书教程
- P2P终结者:企业网络P2P流量管理利器
- Windows XP官方桌面主题:Royale蓝色与Zune主题赏析
- 编译原理课程讲义要点解析与学习技巧
- 内容完善美观的同学录软件介绍
- Inno Setup:小巧且功能强大的安装制作软件
- SSH宠物练习项目:探索struts, hibernate, spring与Ajax集成
- 掌握HyperLinkField的传值技巧与应用
- 一键部署PHP+Apache+MySQL开发环境