WinApi:无法读取注册表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WinApi:无法读取注册表相关的知识,希望对你有一定的参考价值。

我试图使用winapi和c ++读取注册表。

代码运行,但结果不是注册表的内容在hexdump只是0xCD反复重复之后。 (所以,好像数据还没有被RegQueryValueEx修改,并且只是malloc的结果)我也尝试以管理员身份运行,没有运气。

这是我正在使用的代码:

HKEY hKey;
if (RegOpenKeyEx(HKEY_CURRENT_USER, "Software\Microsoft\Windows\Shell\Bags\1\Desktop", 0, KEY_ALL_ACCESS, &hKey) != ERROR_SUCCESS)
    return;

//Read & save
DWORD BufferSize = TOTALBYTES;
DWORD cbData;
DWORD dwRet;

LPBYTE data = (LPBYTE)malloc(BufferSize);
cbData = BufferSize;

DWORD type = REG_BINARY;

dwRet = RegQueryValueEx(hKey, "IconLayouts", NULL, &type, data, &cbData);

while (dwRet == ERROR_MORE_DATA) {

    BufferSize += BYTEINCREMENT;
    data = (LPBYTE)realloc(data, BufferSize);
    cbData = BufferSize;

    dwRet = RegQueryValueEx(hKey, "IconLayouts", NULL, &type, data, &cbData);
}

if (dwRet == ERROR_SUCCESS)
{
    //Write current registry to a file
    std::ofstream currentRegistryFile(DIRECTORY + currentDesktop + ".bin");
    if (!currentRegistryFile) {
        log(currentDesktop + " file couldn't be opened.");
        return;
    }
    for (int i = 0; i < cbData; i++)
        currentRegistryFile << (data)[cbData];
}
else
    log("Couldnt read registry");


//Close registry
RegCloseKey(hKey);
答案

您的保存代码是问题所在。它实际上是超出界限访问数组:

for (int i = 0; i < cbData; i++)
    currentRegistryFile << (data)[cbData];

请注意,您使用data的常量值而不是循环变量cbData来索引i。改变这一点。

以上是关于WinApi:无法读取注册表的主要内容,如果未能解决你的问题,请参考以下文章

使用 WinAPI 的应用程序设置

WinAPI 鼠标点击无法正常工作

无法加载多个位图 - WinAPI [重复]

GLSL:无法从 FBO 读取纹理并使用片段着色器渲染到另一个 FBO

OpenGL、GLSL 片段着色器无法读取 Sampler2D 纹理

无法使用 WinAPI 显示窗口