C++ 从注册表中获取 Windows 产品 ID

标签 c++ winapi registry

我已经在互联网上搜索并找到了很多对我不起作用的“解决方案”:/

我有这个:

HKEY keyHandle;
char rgValue[1024];
char fnlRes[1024];
DWORD size1;
DWORD Type;

if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion", 0, KEY_QUERY_VALUE | KEY_WOW64_64KEY, &keyHandle) == ERROR_SUCCESS)
{
    size1 = 1023;
    RegQueryValueEx(keyHandle, L"Productid", NULL, &Type, (LPBYTE)rgValue, &size1);
    sprintf_s(fnlRes, "Product ID of your Windows system is:: %s", rgValue);
}
else strcpy_s(fnlRes, "Couldn't access system information!");

RegCloseKey(keyHandle);

std::cout << fnlRes;

我在控制台中得到了这个:

Screenshot

最佳答案

原因是字符编码不匹配。您正在调用 RegQueryValueEx() 的 Unicode 版本,但给它一个 Ansi 缓冲区来填充。使用 WCHAR 而不是 char:

HKEY keyHandle;
WCHAR rgValue[1024];
WCHAR fnlRes[1024];
DWORD size1;
DWORD Type;

if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion", 0, KEY_QUERY_VALUE | KEY_WOW64_64KEY, &keyHandle) == ERROR_SUCCESS)
{
    size1 = 1023;
    RegQueryValueExW(keyHandle, L"Productid", NULL, &Type, (LPBYTE)rgValue, &size1);
    swprintf_s(fnlRes, L"Product ID of your Windows system is:: %s", rgValue);
    RegCloseKey(keyHandle);
}
else wcscpy_s(fnlRes, L"Couldn't access system information!");

wcout << fnlRes;

关于C++ 从注册表中获取 Windows 产品 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35296105/

相关文章:

c++ - 在 MATLAB 中迭代坐标矩阵的最佳方法?

c++ - 坚持 OpenProcess,总是返回 0

registry - 此提供程序未实现 IDynamicPropertyCmdletProvider 接口(interface)

c# - Windows RegKey - 默认浏览器应用程序路径

c++ - 有没有更好的方法在 C++ 中使用异步 TCP 套接字而不是轮询或选择?

c++ - 如果元素类型是基本类型,std::vector::resize() 是否向下花费 O(1) 时间?

c++ - Win32 内存映射文件与 CRT fopen/fread 的性能

c++ - TCP IOCP 在 acceptex 之后收不到

git - 如何使用带有模块的私有(private) go 包

c++ - 使用指向成员的指针时,如何通过作用域解析运算符获取类成员的地址?