繁体   English   中英

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

[英]C++ application crash when trying to read registry subkey

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

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()有效,是的,它确实有效。

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

您应该使用sizeof(out)而不是strlen(out)+1 该变量未初始化,根据您的构建方式,该变量可以用零填充(在这种情况下,您告诉RegGetValue()它可以向其中写入1个字节),或者可以包含随机数据(在这种情况下,您要告诉RegGetValue()可以写入随机数的字节)。

第二个问题是RegOpenKeyEx()是用KEY_SET_VALUE调用的,因此您甚至没有读取权限。 您需要KEY_QUERY_VALUE

第三个问题(可能导致崩溃的原因)是将strlen(out)+1的结果strlen(out)+1转换为指针。 这是一个数字,而不是指针。 该函数需要一个指针,以便它可以写入它实际读取的字节数。 采用:

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

最后,正如所有注释所提到的,您应该检查所有函数的错误并处理所有错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM