C++ 从注册表C++;撞车
怎么了?当我想要获得AUVersion的值时,它崩溃了。注册表中存在此项,但我无法获取它C++ 从注册表C++;撞车,c++,winapi,C++,Winapi,怎么了?当我想要获得AUVersion的值时,它崩溃了。注册表中存在此项,但我无法获取它 int main(int argc, char *argv[]) { HKEY key; if (RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\JavaSoft\\Auto Update\\"), &key) != ERROR_SUCCESS) { cout << "Unable to open re
int main(int argc, char *argv[])
{
HKEY key;
if (RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\JavaSoft\\Auto Update\\"), &key) != ERROR_SUCCESS)
{
cout << "Unable to open registry key\n\n";
}
char path[1024];
DWORD value_length = 1024;
//here is the crash
RegQueryValueEx(key, "AUVersion", NULL, (LPDWORD)REG_SZ, (LPBYTE)&path, &value_length);
cout << "the value read from the registry is: " << path << endl;
system("pause");
return 0;
}
intmain(intargc,char*argv[])
{
香港海关关卡;
if(RegOpenKey(HKEY_LOCAL_MACHINE,TEXT(“SOFTWARE\\JavaSoft\\Auto Update\\”),&key)!=ERROR\u SUCCESS)
{
cout第四个参数是一个LPDWORD
——一个指向DWORD的指针。您获取一个正则整数并将其转换为一个指针,该指针(在取消引用时)将崩溃
该参数接收注册表值的类型。如果您不想知道该类型,请将其设置为NULL。第四个参数是一个LPDWORD
——一个指向DWORD的指针。您获取一个正则整数并将其强制转换为一个指针,该指针(在取消引用时)将崩溃
该参数接收注册表值的类型。如果您不想知道该类型,请将其设置为NULL。调用时出现两个错误:
- 类型参数已写入,因此必须是有效地址,而不是:
(LPDWORD)REG_SZ
这可能是坠机的原因
路径
应该是路径
改为:
DWORD type;
RegQueryValueEx(key, "AUVersion", NULL, &type, (LPBYTE) path, &value_length);
您必须检查RegQueryValueEx()
的结果,以确保path
已填充且后续代码未处理单位化变量:
const DWORD result = RegQueryValueEx(key,
"AUVersion",
NULL,
&type,
(LPBYTE) path,
&value_length);
// Check status of the query and ensure it was a string
// that was read.
if (ERROR_SUCCESS == result && REG_SZ == type)
{
// Success.
}
对的调用有两个错误:
- 类型参数已写入,因此必须是有效地址,而不是:
(LPDWORD)REG_SZ
这可能是坠机的原因
路径
应该是路径
改为:
DWORD type;
RegQueryValueEx(key, "AUVersion", NULL, &type, (LPBYTE) path, &value_length);
您必须检查RegQueryValueEx()
的结果,以确保path
已填充且后续代码未处理单位化变量:
const DWORD result = RegQueryValueEx(key,
"AUVersion",
NULL,
&type,
(LPBYTE) path,
&value_length);
// Check status of the query and ensure it was a string
// that was read.
if (ERROR_SUCCESS == result && REG_SZ == type)
{
// Success.
}
@nneonneo注意到了。我唯一省略的是它必须是RegQueryValueEx()的ASCII版本
。我没有投反对票,但我只是在看MSDN文档,显然您应该检查是否有错误\u更多\u数据,因为您的缓冲区最初可能也会被删除small@0A0D,我的示例代码说明用户必须检查返回值。OP应该阅读文档并处理它。@nneonneo,注意到了。我唯一拥有的是omi它必须是RegQueryValueEx()的ASCII版本
。我没有投反对票,但我只是在看MSDN文档,显然您应该检查是否有错误\u更多\u数据,因为您的缓冲区最初可能也会被删除small@0A0D,我的示例代码说明用户必须检查返回值。OP应该阅读文档并处理它。@user1857483如果这是答案,您应该接受它。单击此答案旁边的绿色复选框。@user1857483如果这是答案,您应该接受它。单击此答案旁边的绿色复选框。