Visual c++ 如何获取c+中注册表项的值+;没有访问冲突? 嘿,我是C++的新手,我想知道指定的注册表索引是否存在。我必须检查多个位置,因为软件可能在64位机器上运行,并且处于WOW6432节点键下,而不是通常的位置。当RegQueryValueExA(使用Visual C++ 6在XP上,所以我不能使用一个新的函数)运行时,如果存在密钥,它应该返回一个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 program\n"; //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 program\n"; //path= Value in key } return true; } bool findandlemoveuninstall(字符串路径){ 布尔结果; 结果=RegQueryValueExA(HKEY_本地_机器, 文本(“软件\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\ABC”),NULL,NULL,NULL,(无符号长*)最大路径; 如果(结果=错误\成功){ 你可能有很多问题

Visual c++ 如何获取c+中注册表项的值+;没有访问冲突? 嘿,我是C++的新手,我想知道指定的注册表索引是否存在。我必须检查多个位置,因为软件可能在64位机器上运行,并且处于WOW6432节点键下,而不是通常的位置。当RegQueryValueExA(使用Visual C++ 6在XP上,所以我不能使用一个新的函数)运行时,如果存在密钥,它应该返回一个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 program\n"; //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 program\n"; //path= Value in key } return true; } bool findandlemoveuninstall(字符串路径){ 布尔结果; 结果=RegQueryValueExA(HKEY_本地_机器, 文本(“软件\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\ABC”),NULL,NULL,NULL,(无符号长*)最大路径; 如果(结果=错误\成功){ 你可能有很多问题,visual-c++,registry,registrykey,Visual C++,Registry,Registrykey,RegQueryValueExA的最后一个参数 lpcbData[输入、输出、可选] 指向变量的指针,该变量指定lpData参数指向的缓冲区大小 但您没有传递指向变量的指针。您传递的是(unsigned long*)MAX_PATH,这是一个垃圾指针。当操作系统试图将结果存储到指针中时,会发生访问冲突。您需要传递指向变量的指针,如文档所述 下一个问题是,您正在调用A函数(显式ANSI),但使用的是TEXT宏(自适应字符集)。请确定您使用的是哪种模型(ANSI或自适应),然后选择一种模型或另一种模

RegQueryValueExA的最后一个参数

lpcbData[输入、输出、可选]

指向变量的指针,该变量指定lpData参数指向的缓冲区大小

但您没有传递指向变量的指针。您传递的是
(unsigned long*)MAX_PATH
,这是一个垃圾指针。当操作系统试图将结果存储到指针中时,会发生访问冲突。您需要传递指向变量的指针,如文档所述

下一个问题是,您正在调用
A
函数(显式ANSI),但使用的是
TEXT
宏(自适应字符集)。请确定您使用的是哪种模型(ANSI或自适应),然后选择一种模型或另一种模型。假设您是显式ANSI

下一个问题是您没有指定输出缓冲区,因此实际上无法检索路径

另一个问题是,
RegQueryValueExA
函数不返回
bool
;它返回一个错误代码

还有一个问题是,如果
测试包含一个赋值,那么它实际上不会测试任何东西

另一个问题是,您没有指定函数将路径返回给调用方的方法。假设您希望在
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
}
boolfinduninstall(字符串和路径){//通过引用传递的参数,修复函数名
LONG result;//更改变量类型
char buffer[MAX_PATH];//提供输出缓冲区
DWORD bufferSize=MAX_PATH;//和一个用于指定缓冲区大小/接收数据大小的变量
结果=RegQueryValueExA(HKEY_本地_机器,
“SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\ABC”、NULL、NULL、(LPBYTE)buffer和bufferSize);//删除文本宏,传递缓冲区和缓冲区大小
if(result==ERROR\u SUCCESS){//修复比较

您是否可以使用管理员权限(如“以管理员身份运行”)运行程序,或者在清单中指定这样做?
(unsigned long*)MAX_PATH
毫无意义。