ZBLOG

不用 c++11

如果你不想使用C++11标准,可以尝试以下方法获取硬盘序列号:

  1. 使用Windows API(适用于Windows系统):
#include <iostream>
#include <windows.h>

std::string getHardDriveSerialNumber() {
    DWORD serialNumber;
    if (GetVolumeInformation("C:\\", NULL, 0, &serialNumber, NULL, NULL, NULL, 0)) {
        char buffer[20];
        snprintf(buffer, sizeof(buffer), "%04X-%04X", HIWORD(serialNumber), LOWORD(serialNumber));
        return std::string(buffer);
    }
    return "";
}

int main() {
    std::string serialNumber = getHardDriveSerialNumber();

    if (!serialNumber.empty()) {
        std::cout << "Hard Drive Serial Number: " << serialNumber << std::endl;
    } else {
        std::cout << "Failed to retrieve the hard drive serial number." << std::endl;
    }

    return 0;
}

这段代码使用了GetVolumeInformation函数来获取C盘的卷序列号。

  1. 使用WMI(适用于Windows系统):
#include <iostream>
#include <comdef.h>
#include <Wbemidl.h>

#pragma comment(lib, "wbemuuid.lib")

std::string getHardDriveSerialNumber() {
    HRESULT hr;

    // 初始化COM库
    hr = CoInitializeEx(0, COINIT_MULTITHREADED);
    if (FAILED(hr)) {
        throw std::runtime_error("Failed to initialize COM library.");
    }

    // 设置COM安全级别
    hr = CoInitializeSecurity(
        nullptr,
        -1,
        nullptr,
        nullptr,
        RPC_C_AUTHN_LEVEL_DEFAULT,
        RPC_C_IMP_LEVEL_IMPERSONATE,
        nullptr,
        EOAC_NONE,
        nullptr
    );
    if (FAILED(hr)) {
        CoUninitialize();
        throw std::runtime_error("Failed to initialize COM security.");
    }

    // 获取WMI服务
    IWbemLocator* pLocator = nullptr;
    hr = CoCreateInstance(
        CLSID_WbemLocator,
        0,
        CLSCTX_INPROC_SERVER,
        IID_IWbemLocator,
        reinterpret_cast<LPVOID*>(&pLocator)
    );
    if (FAILED(hr)) {
        CoUninitialize();
        throw std::runtime_error("Failed to create WbemLocator instance.");
    }

    IWbemServices* pServices = nullptr;
    
    // 连接WMI服务
    hr = pLocator->ConnectServer(
        L"ROOT\\CIMV2",
        nullptr, nullptr, nullptr, 0, nullptr, nullptr, &pServices
    );
    
	if (FAILED(hr)) {
		pLocator->Release();
		CoUninitialize();
		throw std::runtime_error("Failed to connect to WMI service.");
	}

	// 设置验证信息
	hr = CoSetProxyBlanket(
		pServices, 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)) {
	    pServices->Release();
	    pLocator->Release();
	    CoUninitialize();
	    throw std::runtime_error("Failed to set proxy blanket.");
	}

	IEnumWbemClassObject* pEnumerator = NULL;
	hr = pServices->ExecQuery(
	        BSTR(L"WQL"), BSTR(L"SELECT * FROM Win32_PhysicalMedia"),
	        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
	        
	if (FAILED(hr)) {
	    pServices->Release();
	    pLocator->Release();
	    CoUninitialize();
	    throw std::runtime_error("Failed to execute WQL query.");
	}
	
    IWbemClassObject* pObject = nullptr;
	ULONG returnedCount = 0;

	std::string serialNumber;
    
    // 遍历查询结果
	while ((hr = pEnumerator->Next(WBEM_INFINITE, 1, &pObject, &returnedCount)) == S_OK) {
		VARIANT vtProp;
		
		// 获取序列号属性
		hr = pObject->Get(L"SerialNumber", 0, &vtProp, 0, 0);
		
		if (SUCCEEDED(hr) && vtProp.vt == VT_BSTR) {
			serialNumber = _com_util::ConvertBSTRToString(vtProp.bstrVal);
			break;
		}
		
        VariantClear(&vtProp);

        // 释放对象资源
        pObject->Release();
    }
    
    // 释放资源
	pEnumerator->Release();
	pServices->Release();
	pLocator->Release();
	CoUninitialize();

	return serialNumber;
}

int main() {
	try {
	    std::string serialNumber = getHardDriveSerialNumber();

	    if (!serialNumber.empty()) {
	        std::cout << "Hard Drive Serial Number: " << serialNumber << std::endl;
	    } else {
	        std::cout << "Failed to retrieve the hard drive serial number." << std::endl;
	    }

	    return 0;
	} catch (const std::exception& e) {
        std::cerr << "Error: " << e.what() << std::endl;
        return 1;
    }
}

这段代码使用了WMI(Windows Management Instrumentation)来查询硬盘的序列号。需要链接wbemuuid.lib库,并确保编译器支持COM。

这些方法适用于Windows系统,如果你在其他操作系统上使用C++获取硬盘序列号,可能需要使用不同的方法或者库。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=17758

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?