簡體   English   中英

如何讓注冊表讀取 function 正常工作? (c++)

[英]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)

您正在混合使用charTCHAR 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM