使用 C++ 读取注册表时出现奇怪的随机字符

问题描述 投票:0回答:1

所以我正在尝试用 C++ 读取注册表。然而,当我做一些随机的 ascii 字符出现。这只会在我尝试访问软件密钥时发生,它适用于任何其他密钥。


#include <iostream>
#include <cctype>
#include <windows.h>

//Basic registry tweaking code made by Przemyslaw Zaworski in 2017
//to store passwords

std::string registry_read (LPCTSTR subkey,LPCTSTR name,DWORD type)
{
    HKEY key;
    TCHAR value[255];
    DWORD value_length = 255;
    RegOpenKey(HKEY_LOCAL_MACHINE,subkey,&key);
    RegQueryValueEx(key,name, NULL, &type, (LPBYTE)&value, &value_length);
    RegCloseKey(key);
    return value;
    
}

void registry_write (LPCTSTR subkey,LPCTSTR name,DWORD type,const char* value)
{
    HKEY key;
    RegOpenKey(HKEY_LOCAL_MACHINE,subkey,&key);
    RegSetValueEx(key, name, 0, type, (LPBYTE)value, strlen(value)*sizeof(char));
    RegCloseKey(key);
}


int main(){
    //TODO: fix this what the
    std::string text = registry_read("SOFTWARE\\FilePasser","Password",REG_SZ); //Read the registry value
    std::cout << text << std::endl; 
    std::string input;
    return 0;
}

This pops up instead of the expected value

我尝试将软件更改为硬件,但它会在重新启动时删除该值。并且该软件会出现这个奇怪的错误

c++ windows c++17 registry
1个回答
0
投票

您的实施情况会有所不同,具体取决于您是否在包含

UNICODE
之前定义了
Windows.h
(检查项目设置中的预处理器定义)。
TCHAR
是 unicode 中的
WCHAR
和 ascii 中的
CHAR
。 Windows 使用 utf-16 支持 unicode,其中每个字符都是 16 位,而典型的
char
是 8 位。因此尝试在 utf-16 字符串上使用
std::string
会导致编码错误。

如果您想要 unicode,请保持代码不变并使用

std::wstring
std::wcout
。如果您不想要 unicode,请从项目设置中删除
UNICODE
定义,或将
TCHAR
s 替换为常规
char
s 并使用 winapi 函数的 ascii 版本。

非 unicode 示例:

std::string registry_read(LPCSTR subkey,LPCSTR name,DWORD type)
{
    HKEY key;
    char value[255];
    DWORD value_length = 255;
    RegOpenKeyA(HKEY_LOCAL_MACHINE,subkey,&key);
    RegQueryValueExA(key,name, NULL, &type, (LPBYTE)&value, &value_length);
    RegCloseKey(key);
    return value;
}
© www.soinside.com 2019 - 2024. All rights reserved.