尝试读取注册表子项时C ++应用程序崩溃

时间:2017-11-09 16:49:52

标签: c++ windows

我正在编写一个应该返回注册表子项值的程序。我试过这段代码:

LPCTSTR sk = TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\");
HKEY regkey;
char out[255];
RegOpenKeyEx(HKEY_CURRENT_USER, sk, 0, KEY_SET_VALUE, &regkey);
RegGetValue(regkey, L"test", NULL, RRF_RT_ANY, NULL, (PVOID)&out, (LPDWORD) strlen(out) +1);
RegCloseKey(regkey);
MessageBox(NULL, (LP) out, L"Output", MB_OK);

我在Visual Studio 2017中写了这个,但没有显示任何错误。但是当我运行它时,它会在第5行崩溃。

崩溃原因:

  

reader.exe中的0x7511C481(KernelBase.dll)上的异常错误:0xC0000005:在位置0x00000005处读取时发生访问冲突。 (由谷歌翻译翻译)

我已经检查过RegOpenKeyEx()是否有效,是的确有效。

我做错了什么以及如何解决?

1 个答案:

答案 0 :(得分:2)

您应该使用sizeof(out)而不是strlen(out)+1。该变量未被启用,并且取决于您如何构建它可以用零填充(在这种情况下,您可以告诉RegGetValue()它可以写入1个字节)或者它可以有随机数据(在这种情况下)你告诉RegGetValue()它可以写一个随机数字的字节。)

第二个问题是,使用RegOpenKeyEx()调用了KEY_SET_VALUE,因此您甚至无权阅读。您需要KEY_QUERY_VALUE

第三个问题,也就是导致崩溃的问题,是你将strlen(out)+1的结果转换为指针。它是一个数字,而不是一个指针。该函数期望一个指针,因此它可以写入它实际读取的字节数。使用:

DWORD len = sizeof(out);
RegGetValue(regkey, L"test", NULL, RRF_RT_ANY, NULL, (PVOID)&out, &len);

最后,正如所有评论所提到的,你应该检查所有功能的错误并处理所有这些错误。