嘿,我是C++新手,我正在尝试找出是否存在指定的注册表索引。由于软件可能在 64 位机器上运行并且位于 WOW6432Node 键下而不是通常的位置,因此我必须检查多个位置。当 RegQueryValueExA(在 xp 上使用 visual c++ 6.0,所以我不能使用较新的函数)运行时,如果键存在,它应该返回一个布尔值 true,(稍后我将处理获取键的值)。但是,在运行时,它会生成访问冲突0xc00005。知道出了什么问题吗?
bool FindAndRemoveUninstall(string path){
bool result;
result = RegQueryValueExA(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ABC"), NULL, NULL, NULL, (unsigned long *)MAX_PATH);
if (result= ERROR_SUCCESS){
cout <<" is a 32 bit programn";
//path= Value in key
}
result = RegQueryValueEx(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\ABC"), NULL, NULL, NULL, (unsigned long *)MAX_PATH);
if (result= ERROR_SUCCESS){
cout << " is 64 bit programn";
//path= Value in key
}
return true;
}
您有多个问题。
要RegQueryValueExA
的最后一个参数记录为
lpcbData [输入、输出、可选]
指向变量的指针,该变量指定 lpData 参数指向的缓冲区的大小,
但是您没有传递指向变量的指针。您正在传递(unsigned long *)MAX_PATH
,这是一个垃圾指针。当操作系统尝试将结果存储到指针中时,它会发生访问冲突。您需要传递指向变量的指针,就像文档所说的那样。
下一个问题是您正在调用A
函数(显式 ANSI),但使用的是TEXT
宏(自适应字符集)。决定您正在使用哪种模型(ANSI 或自适应),然后选择一个模型或另一个模型。让我们假设您显式 ANSI。
下一个问题是您没有指定输出缓冲区,因此您实际上并没有检索路径。
另一个问题是RegQueryValueExA
函数不返回bool
,它返回一个错误代码。
另一个问题是,您的if
测试包含作业,因此它实际上并没有测试任何内容。
另一个问题是,您没有指定函数将路径返回给调用方的方法。假设您希望在 path
参数中返回结果。
另一个问题是,32位和64位的情况颠倒了。
此外,您使用的是'n'
而不是std::endl
。
第八个问题是,即使函数没有执行任何操作,也会返回true
。
第九个问题是函数说FindAndRemove
,它找到了,但没有删除。
bool FindUninstall(string& path){ // parameter passed by reference, fix function name
LONG result; // change variable type
char buffer[MAX_PATH]; // provide an output buffer
DWORD bufferSize = MAX_PATH; // and a variable to specify the buffer size / receive the data size
result = RegQueryValueExA(HKEY_LOCAL_MACHINE,
"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ABC", NULL, NULL, (LPBYTE)buffer, &bufferSize); // remove TEXT macro, pass the buffer and buffer size
if (result== ERROR_SUCCESS){ // fix comparison
cout <<" is a 64 bit program" << std::endl; // fix message
path = buffer;
return true; // stop once we have an answer
}
buffersize = MAX_PATH; // reset for next query
result = RegQueryValueEx(HKEY_LOCAL_MACHINE,
"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\ABC", NULL, NULL, (LPBYTE)buffer, &bufferSize); // remove TEXT macro, pass the buffer and buffer size
if (result== ERROR_SUCCESS){ // fix comparison
cout << " is 32 bit program" << std::endl; // fix message
path = buffer;
return true; // stop once we have an answer
}
return false; // nothing found
}
由于您是C++新手,我建议您在深入研究更复杂的事情之前,先获得一些C++做简单项目的经验。