C++ 从注册表读取MachineGuid
我正在尝试手动从注册表读取MachineGuid。这是可行的,RegQueryValueEx提供了我正在寻找的值,但是每个字符后面都有一个空终止字符,为什么会发生这种情况 代码: 结果是: 这只显示我的MachineGuid的1个字符,它以“f”开头。因此,我在Visual Studio中添加了一个断点,以在regquery调用后检查dwMHz数组的值,结果如下:C++ 从注册表读取MachineGuid,c++,windows,registry,C++,Windows,Registry,我正在尝试手动从注册表读取MachineGuid。这是可行的,RegQueryValueEx提供了我正在寻找的值,但是每个字符后面都有一个空终止字符,为什么会发生这种情况 代码: 结果是: 这只显示我的MachineGuid的1个字符,它以“f”开头。因此,我在Visual Studio中添加了一个断点,以在regquery调用后检查dwMHz数组的值,结果如下: 那么为什么我的结果数组被空终止字符污染了呢?您已经将一个Unicode字符串读入了一个字符缓冲区。您正在读取一个utf-16编码
那么为什么我的结果数组被空终止字符污染了呢?您已经将一个Unicode字符串读入了一个字符缓冲区。您正在读取一个utf-16编码的字符串,每个字符占用2个字节。通常第二个字节是0,如果是中文或重音字符,则不会是0。您应该这样做,但是可以通过使用RegQueryValueExA将时钟拨回到上个世纪。而FormatMessageA,您提出了LPWSTR转换,因为编译器已经试图告诉您您做得不对。它不起作用。@Hans错误部分实际上取自一个示例。我会尽量只用ASCII码,谢谢。用wchar\u t代替char
string read_reg_sz()
{
char Buffer[_MAX_PATH];
char dwMHz[_MAX_PATH] = {0};
DWORD BufSize = _MAX_PATH;
DWORD dataType = REG_SZ;
HKEY hKey;
long lError = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Cryptography"), NULL, KEY_READ | KEY_WOW64_64KEY, &hKey);
if (lError != ERROR_SUCCESS)
{
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
lError,
0,
(LPWSTR)Buffer,
_MAX_PATH,
0);
cout << lError << endl;
return "N/A";
}
int val = RegQueryValueEx(hKey, L"MachineGuid", NULL, &dataType, (LPBYTE)&dwMHz, &BufSize);
if (val == ERROR_SUCCESS)
cout << "succes!" << endl;
else
cout << "failed!" << endl;
RegCloseKey(hKey);
cout << "\n reg data read: " << dwMHz;
return dwMHz;
}