我正在编写一个应该返回注册表子项值的程序。我试过这段代码:
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()
是否有效,是的确有效。
我做错了什么以及如何解决?
答案 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);
最后,正如所有评论所提到的,你应该检查所有功能的错误并处理所有这些错误。