C++ C++;尝试读取注册表子项时应用程序崩溃
我正在编写一个程序,它应该返回注册表子项的值。我尝试了以下代码:C++ C++;尝试读取注册表子项时应用程序崩溃,c++,windows,C++,Windows,我正在编写一个程序,它应该返回注册表子项的值。我尝试了以下代码: 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,
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()
它可以写入随机数量的字节)
第二个问题是使用KEY\u SET\u VALUE
调用RegOpenKeyEx()
,因此您甚至没有读取权限。您需要键\u查询\u值
第三个问题,也是可能导致崩溃的问题,是您将strlen(out)+1的结果强制转换为指针。这是一个数字,不是指针。函数需要一个指针,以便它可以写入实际读取的字节数。使用:
DWORD len = sizeof(out);
RegGetValue(regkey, L"test", NULL, RRF_RT_ANY, NULL, (PVOID)&out, &len);
最后,正如所有注释所提到的,您应该检查所有函数上的错误并处理它们。您应该使用sizeof(out)
而不是strlen(out)+1
。该变量未初始化,并且取决于构建方式,该变量可以用零填充(在这种情况下,您告诉RegGetValue()
它可以向其中写入1个字节),也可以具有随机数据(在这种情况下,您告诉RegGetValue()
它可以写入随机数量的字节)
第二个问题是使用KEY\u SET\u VALUE
调用RegOpenKeyEx()
,因此您甚至没有读取权限。您需要键\u查询\u值
第三个问题,也是可能导致崩溃的问题,是您将strlen(out)+1的结果强制转换为指针。这是一个数字,不是指针。函数需要一个指针,以便它可以写入实际读取的字节数。使用:
DWORD len = sizeof(out);
RegGetValue(regkey, L"test", NULL, RRF_RT_ANY, NULL, (PVOID)&out, &len);
最后,正如所有注释所提到的,您应该检查所有函数上的错误并处理所有错误。是否RegOpenKeyEx()
成功?首先,您没有检查这些函数调用是否真的成功。是RegOpenKeyEx()
成功。&out
——为什么要传递指针的地址?这可能与读取注册表无关,与不知道如何将指针传递到缓冲区有关。RegOpenKeyEx()
成功了吗?首先,您没有检查这些函数调用是否实际成功。是RegOpenKeyEx()
成功。&out
——为什么要传递指针的地址?这可能与读取注册表无关,与不知道如何将指针传递到缓冲区有关。这似乎也是错误的。它应该是out
。在这种情况下应该可以工作。对于数组,out
和&out
都指向相同的东西那&out
似乎也错了。它应该是out
。在这种情况下应该可以工作。对于数组,out
和&out
都指向相同的东西--