如何在 C++ 中读取 REG_NONE 值?
How can I read REG_NONE value in C++?
我想用 C++ 从注册表中读取 REG_NONE 值。
这是我的代码:
#include <iostream>
#include <windows.h>
using namespace std;
//--- Değişkenler ---//
//DWORD
DWORD dw_Rn_Boyut = MAX_PATH;
DWORD dw_Rn_Deger;
DWORD dw_Rn_DegerTipi = REG_NONE;
//HKEY
HKEY hkey_Rn;
//LONG
LONG long_Rn_Sonuc;
int main()
{
long_Rn_Sonuc = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\DownloadManager\FoldersTree\Compressed", 0, KEY_READ | KEY_WOW64_64KEY, &hkey_Rn);
if(long_Rn_Sonuc == ERROR_SUCCESS)
{
long_Rn_Sonuc = RegQueryValueEx(hkey_Rn, "pathW", 0, &dw_Rn_DegerTipi, (LPBYTE)&dw_Rn_Deger, &dw_Rn_Boyut);
if(long_Rn_Sonuc == ERROR_SUCCESS)
{
cout << dw_Rn_Deger;
}
}
getchar();
return 0;
}
我的应用程序显示 3801156
作为结果。该值是该注册值的十进制版本。等于3A 00 44
这是我要读取的注册值:
但为什么我的应用程序不读取其他十六进制值?
我该如何解决我的问题?
没有 REG_NONE
值这样的东西。成功后,您的 dw_Rn_DegerTipi
变量将更新为 actual 值类型(在本例中为 REG_BINARY
),并且您的 dw_Rn_Boyut
变量将是已更新 实际 读取的字节数。
您的问题是您为 dw_Rn_Dege
变量使用了错误的数据类型。有问题的数据不是一个 DWORD
值,它是一个 WCHAR
字符串,所以你需要一个 WCHAR
字符缓冲区来接收它。你告诉 RegQueryValueEx()
你分配了一个缓冲区来保存 MAX_PATH
字节,但你真的没有。因此,当 RegQueryValueEx()
尝试将超过 4 个字节写入 dw_Rn_Deger
.
的内存地址时,您的代码中出现缓冲区溢出错误
试试这个:
#include <iostream>
#include <windows.h>
using namespace std;
//--- Değişkenler ---//
WCHAR sz_Rn_Deger[MAX_PATH+1] = {};
DWORD dw_Rn_Boyut = MAX_PATH * sizeof(WCHAR);
//HKEY
HKEY hkey_Rn;
//LONG
LONG long_Rn_Sonuc;
int main()
{
long_Rn_Sonuc = RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\DownloadManager\FoldersTree\Compressed", 0, KEY_QUERY_VALUE | KEY_WOW64_64KEY, &hkey_Rn);
if (long_Rn_Sonuc == ERROR_SUCCESS)
{
long_Rn_Sonuc = RegQueryValueExW(hkey_Rn, L"pathW", NULL, NULL, reinterpret_cast<LPBYTE>(&sz_Rn_Deger), &dw_Rn_Boyut);
if (long_Rn_Sonuc == ERROR_SUCCESS)
{
wcout << sz_Rn_Deger;
}
RegCloseKey(hkey_Rn);
}
getchar();
return 0;
}
我想用 C++ 从注册表中读取 REG_NONE 值。
这是我的代码:
#include <iostream>
#include <windows.h>
using namespace std;
//--- Değişkenler ---//
//DWORD
DWORD dw_Rn_Boyut = MAX_PATH;
DWORD dw_Rn_Deger;
DWORD dw_Rn_DegerTipi = REG_NONE;
//HKEY
HKEY hkey_Rn;
//LONG
LONG long_Rn_Sonuc;
int main()
{
long_Rn_Sonuc = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\DownloadManager\FoldersTree\Compressed", 0, KEY_READ | KEY_WOW64_64KEY, &hkey_Rn);
if(long_Rn_Sonuc == ERROR_SUCCESS)
{
long_Rn_Sonuc = RegQueryValueEx(hkey_Rn, "pathW", 0, &dw_Rn_DegerTipi, (LPBYTE)&dw_Rn_Deger, &dw_Rn_Boyut);
if(long_Rn_Sonuc == ERROR_SUCCESS)
{
cout << dw_Rn_Deger;
}
}
getchar();
return 0;
}
我的应用程序显示 3801156
作为结果。该值是该注册值的十进制版本。等于3A 00 44
这是我要读取的注册值:
但为什么我的应用程序不读取其他十六进制值?
我该如何解决我的问题?
没有 REG_NONE
值这样的东西。成功后,您的 dw_Rn_DegerTipi
变量将更新为 actual 值类型(在本例中为 REG_BINARY
),并且您的 dw_Rn_Boyut
变量将是已更新 实际 读取的字节数。
您的问题是您为 dw_Rn_Dege
变量使用了错误的数据类型。有问题的数据不是一个 DWORD
值,它是一个 WCHAR
字符串,所以你需要一个 WCHAR
字符缓冲区来接收它。你告诉 RegQueryValueEx()
你分配了一个缓冲区来保存 MAX_PATH
字节,但你真的没有。因此,当 RegQueryValueEx()
尝试将超过 4 个字节写入 dw_Rn_Deger
.
试试这个:
#include <iostream>
#include <windows.h>
using namespace std;
//--- Değişkenler ---//
WCHAR sz_Rn_Deger[MAX_PATH+1] = {};
DWORD dw_Rn_Boyut = MAX_PATH * sizeof(WCHAR);
//HKEY
HKEY hkey_Rn;
//LONG
LONG long_Rn_Sonuc;
int main()
{
long_Rn_Sonuc = RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\DownloadManager\FoldersTree\Compressed", 0, KEY_QUERY_VALUE | KEY_WOW64_64KEY, &hkey_Rn);
if (long_Rn_Sonuc == ERROR_SUCCESS)
{
long_Rn_Sonuc = RegQueryValueExW(hkey_Rn, L"pathW", NULL, NULL, reinterpret_cast<LPBYTE>(&sz_Rn_Deger), &dw_Rn_Boyut);
if (long_Rn_Sonuc == ERROR_SUCCESS)
{
wcout << sz_Rn_Deger;
}
RegCloseKey(hkey_Rn);
}
getchar();
return 0;
}