用api函数读取硬盘的序列号

用api函数读取硬盘的序列号

在写程序时我们想对每一台计算机都生成一个唯一的标识,而且在一此共享软件中我们也看到,软件在不同的机器上生成了不同的标识,这是如何实现的呢,其实是软件有一部分程序读取了,本地计算机的一部分硬件参数(如硬盘序列号,网卡序列号等等),再通过一系列算法而得到了一个唯一标识,其实我们也可以通过一个api函数生成我们的唯一标识,由于硬盘人人都有,而网卡不一定每个人都有,所以以读硬盘序列号为例,
下面就先介绍一下我们要用到的api函数
 BOOL GetVolumeInformation(
  LPCTSTR lpRootPathName,           // 硬盘的路径
  LPTSTR lpVolumeNameBuffer,        // 硬盘的卷标
  DWORD nVolumeNameSize,            // 卷标的字符串长度
  LPDWORD lpVolumeSerialNumber,     // 硬盘的序列号
  LPDWORD lpMaximumComponentLength, // 最大的文件长度
  LPDWORD lpFileSystemFlags,        // 文件系统的一此标志
  LPTSTR lpFileSystemNameBuffer,    // 存储所在盘符的分区类型的长指针变量
  DWORD nFileSystemNameSize         // 分区类型的长指针变量所指向的字符串长度
);
如果上述函数成功就返回一个非0值。

光说不做,是不行了,我们还得实践一下:// 最大的文件长度
首选用MFC AppWizard建立一个基于Dialog base的对话框工程,名为GetHardID,点击finish。
加一个按钮,双击它,点击

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Windows操作系统中,可以使用WMI(Windows Management Instrumentation)API函数获取硬盘序列号。以下是一个示例代码: ```c++ #include <iostream> #include <windows.h> #include <winioctl.h> #include <Ntddscsi.h> #pragma comment(lib, "wbemuuid.lib") using namespace std; int main() { // 初始化COM库 HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); if (FAILED(hr)) { cerr << "Failed to initialize COM library." << endl; return 1; } // 连接WMI服务 IWbemLocator *pLoc = NULL; hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc); if (FAILED(hr)) { cerr << "Failed to create IWbemLocator object." << endl; CoUninitialize(); return 1; } IWbemServices *pSvc = NULL; hr = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &pSvc); if (FAILED(hr)) { cerr << "Failed to connect to IWbemServices." << endl; pLoc->Release(); CoUninitialize(); return 1; } // 设置WMI查询语句 BSTR query = SysAllocString(L"SELECT * FROM Win32_DiskDrive"); IEnumWbemClassObject* pEnumerator = NULL; hr = pSvc->ExecQuery(_bstr_t(L"WQL"), query, WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); if (FAILED(hr)) { cerr << "Failed to execute query." << endl; pSvc->Release(); pLoc->Release(); CoUninitialize(); return 1; } // 遍历查询结果 ULONG uReturn = 0; while (pEnumerator) { IWbemClassObject *pclsObj = NULL; HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if (0 == uReturn) { break; } VARIANT vtProp; hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0); if (FAILED(hr)) { cerr << "Failed to get serial number." << endl; pclsObj->Release(); continue; } wcout << "Serial number: " << vtProp.bstrVal << endl; VariantClear(&vtProp); pclsObj->Release(); } // 释放资源 pEnumerator->Release(); pSvc->Release(); pLoc->Release(); CoUninitialize(); return 0; } ``` 该程序使用WMI查询语句"SELECT * FROM Win32_DiskDrive"获取所有硬盘的信息,然后遍历结果集,获取每个硬盘序列号。请注意,该程序需要管理员权限才能读取硬盘信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值