C++ RegGetValue问题
我试图写一个C++中的简单脚本来搜索注册表(软件\\\\Windows \CurrutValue\Ext卸载),并返回DISPLAYNAMED值的值。 我浏览了MSDN文档,在谷歌上搜索了几个小时,不幸的是我被卡住了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
#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
(和宽字符文本):
我可以看到您的原始代码存在两个主要问题:
字符值[255]
。使用wchar\u t
或TCHAR
代替char
。RegGetValue()
函数将自动“转发”到RegGetValueW()
或RegGetValueA()
函数,具体取决于项目的Unicode设置。如果希望强制使用特定的字符集,可以直接使用这些函数,但通常最好直接使用RegGetValue()
函数#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。