[英]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, ®key);
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.