如何在不违反访问冲突的情况下获取 c++ 中注册表项的值



嘿,我是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++做简单项目的经验。

最新更新