Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;尝试读取注册表子项时应用程序崩溃_C++_Windows - Fatal编程技术网

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, &regkey); 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, &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()
它可以写入随机数量的字节)

第二个问题是使用
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
都指向相同的东西--