Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.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++ RegGetValue问题_C++_Winapi_Registry - Fatal编程技术网

C++ RegGetValue问题

C++ RegGetValue问题,c++,winapi,registry,C++,Winapi,Registry,我试图写一个C++中的简单脚本来搜索注册表(软件\\\\Windows \CurrutValue\Ext卸载),并返回DISPLAYNAMED值的值。 我浏览了MSDN文档,在谷歌上搜索了几个小时,不幸的是我被卡住了 #define BUFFER 8192 char value[255]; DWORD BufferSize = BUFFER; if(RegGetValue(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows\\Cur

我试图写一个C++中的简单脚本来搜索注册表(软件\\\\Windows \CurrutValue\Ext卸载),并返回DISPLAYNAMED值的值。

我浏览了MSDN文档,在谷歌上搜索了几个小时,不幸的是我被卡住了

#define BUFFER 8192
char value[255];
DWORD BufferSize = BUFFER;

if(RegGetValue(HKEY_LOCAL_MACHINE,
    _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"),
    _T("DisplayName"),
    RRF_RT_ANY,
    NULL,
    (PVOID)&value,
    &BufferSize)
    )
{
    _tprintf(TEXT("(%d) %s - %s\n"), i+1, achKey, value);
}
现在,我需要能够将achKey附加到RegGetValue的第二个参数,以便它在循环每个子键时获取正确的值

我尝试了一百万种不同的方法,不幸的是我在C++中的经验是相当有限的,我的谷歌技能显然也需要一些工作。 编辑: achKey是密钥的名称: 例:英伟达司机

因此,当附加时,第二个参数应为:

SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\NVIDIA Drivers
以下是关于RegGetValue的MSDN参考:

我也尝试过类似的方法:

wcscat(_T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"), achKey)
std::string path("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\");
std::string achKey = get_key();

RegGetValueEx(HKEY_LOCAL_MACHINE, (path+achKey).c_str(), /* ... */);
wcscat(_T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"), achKey)

它会编译,但运行时会崩溃。

这里介绍的是非常基本的字符串操作。比如:

wcscat(_T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"), achKey)
std::string path("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\");
std::string achKey = get_key();

RegGetValueEx(HKEY_LOCAL_MACHINE, (path+achKey).c_str(), /* ... */);
wcscat(_T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"), achKey)
如果您使用的是宽字符串,则需要使用
wstring
(和宽字符文本):


我可以看到您的原始代码存在两个主要问题:

  • 混合Unicode/ACSII字符串:从您的评论中可以看出,您正在使用Unicode字符串编译项目,但您使用的是
    字符值[255]
    。使用
    wchar\u t
    TCHAR
    代替
    char
    RegGetValue()
    函数将自动“转发”到
    RegGetValueW()
    RegGetValueA()
    函数,具体取决于项目的Unicode设置。如果希望强制使用特定的字符集,可以直接使用这些函数,但通常最好直接使用
    RegGetValue()
    函数
  • 缓冲区溢出:您正在使用255个元素的字符缓冲区,但将缓冲区的大小传递为8192。如果注册表项超过255个字节(不是字符),则会导致缓冲区溢出,并会发生不好的事情。确保传递的缓冲区大小不超过确切值。还要注意字节和Unicode字符串字符之间的差异。有些函数可能期望或返回以字节为单位的缓冲区大小,有些函数则返回以字符为单位的缓冲区大小
  • 下面的代码是以您希望的方式使用宽字符串的示例:

    #include <iostream>
    #include <string>
    
        ...
    std::wstring BaseKey(_T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"));
    std::wstring achKey(_T("DisplayName"));
    std::wstring NewKey;
    
    NewKey = BaseKey + achKey;
    wcout << NewKey << _T("\n");
    NewKey = BaseKey + _T("AnotherName");
    wcout << NewKey << _T("\n");
    
    我也尝试过类似的方法:

    wcscat(_T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"), achKey)
    
    std::string path("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\");
    std::string achKey = get_key();
    
    RegGetValueEx(HKEY_LOCAL_MACHINE, (path+achKey).c_str(), /* ... */);
    
    wcscat(_T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"), achKey)
    
    它将编译,但在运行时 撞车

    这是因为您正试图将某些内容连接到一个文本字符串上,所以最好的情况是您将践踏应用程序的随机区域。我有点惊讶它编译时没有错误或警告,因为文本字符串是const


    用4个空格缩进以形成代码块,不要使用
    。什么是achKey?我想这是匹配的密钥的名称吗?@ BurgOS——YESIR,它是密钥的名称。坚持C++字符串而不是char []:STD::string(或STD::UntryWString)。你唯一需要担心的是,像
    RegGetValue
    这样的Windows API调用生活在一个旧的、大脑受损的世界中。要将std::string传递给这些函数,请使用
    c_str()
    方法<代码>标准::字符串foo=“HKLM/../”;foo=foo+后缀;RegGetValue(…,foo.c_str(),…)
    不幸的是,我事先不知道子键的名称。我需要能够将变量“achKey”附加到SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\n另外,尝试执行path+“Text Here”无效(path+achKey也无效),“没有合适的从std::到“LPCWSTR”的转换函数”@Josh:如果使用宽字符串,则需要使用
    std::wstring
    。然后
    path+achKey
    应该是有效的(好吧,它真的不应该是有效的,其他任何东西也不应该使用那该死的HN垃圾,但无论如何它是有效的)。甚至不会编译。我在google上搜索了一遍又一遍,寻找一种连接文本宏字符串和tchar变量的方法。什么都没有起作用,我甚至没有发现有人试图这么做。您需要对生成的字符串执行
    .c_str()
    ,以便将其传递给需要指向该字符串的指针的函数。没有像MFC或ATL CString那样的隐式转换。好的,我认为我们走在了正确的轨道上。achKey不是我定义的东西。它是子键名称变量。achKey是一个TCHAR。那么我该如何连接:std::wstring BaseKey(\u T(“软件\\Microsoft\\Windows\\CurrentVersion\\Uninstall\”);和一个TCHAR变量。我先道歉,如果我的错误很简单,我几乎没有在C++中的经验,只是PHP。但是我已经试着弄明白这一点好几天了。我还应该提到RegGetValue中的第二个参数必须是LPCWSTR。