[英]How to get a registry read function to work properly? (c++)
當我編譯並運行以下代碼片段(在 Visual Studio 2019 中)時,它運行但返回的值不正確
Key Value: 000000D1E14FF920 and actual bytes read was: 12
代替
Key Value: 18363 and actual bytes read was: 6
這是代碼
#include <Windows.h>
#include <iostream>
#include <string>
#include <tchar.h>
wchar_t value[255];
DWORD BufferSize = sizeof(value);
RegGetValue(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\"), _T("CurrentBuildNumber"), RRF_RT_ANY, NULL, (PVOID)&value, &BufferSize);
std::cout << "Key Value: " << value << " and actual bytes read was: " << BufferSize << std::endl;
我嘗試了多種解決此問題的方法,但我無法讓它與 Visual Studio 一起正常工作(可能是因為它使用 unicode)
您正在混合使用char
和TCHAR
API。 很明顯, RegGetValue()
正在返回一個 Unicode 寬字符串,因為 12 個字節對於 6 字符空終止wchar_t
字符串是正確的。 所以TCHAR
在你的構建中映射到wchar_t
,因此RegGetValue()
正在調用RegGetValueW()
。 您正在嘗試使用不支持wchar_t
字符串的std::cout
打印出該寬字符串,因此您實際上是在調用std::basic_osteam::operator<<
的void*
重載。 這就是為什么您會看到打印出 memory 地址的原因。
要正確處理TCHAR
,請嘗試以下操作:
#include <Windows.h>
#include <iostream>
#include <string>
#include <tchar.h>
#ifdef UNICODE
#define tcout std::wcout
#else
#define tcout std::cout
#endif
TCHAR value[255] = {};
DWORD BufferSize = sizeof(value);
RegGetValue(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\"), _T("CurrentBuildNumber"), RRF_RT_REG_SZ, NULL, &value, &BufferSize);
tcout << _T("Key Value: ") << value << _T(" and actual bytes read was: ") << (BufferSize / sizeof(TCHAR)) << std::endl;
但是,您真的應該忘記TCHAR
的存在,它不再在現代編碼中占有一席之地。 僅 go 完整 Unicode 僅:
#include <Windows.h>
#include <iostream>
#include <string>
WCHAR value[255] = {}
DWORD BufferSize = sizeof(value);
RegGetValueW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\", L"CurrentBuildNumber", RRF_RT_REG_SZ, NULL, &value, &BufferSize);
std::wcout << L"Key Value: " << value << L" and actual bytes read was: " << (BufferSize / sizeof(WCHAR)) << std::endl;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.