所以我正在尝试用 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;
}
我尝试将软件更改为硬件,但它会在重新启动时删除该值。并且该软件会出现这个奇怪的错误
您的实施情况会有所不同,具体取决于您是否在包含
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;
}