我需要从注册表中获取路径。以下代码的工作原理除了我存储字符串路径的最后一部分。在Visual Studio 2008中运行调试器时,char数组具有路径,但每个其他字符都为零。这导致仅为字符串分配第一个字母。我已经尝试将char res[1024]
更改为char *res = new char[1024]
,这只是使它存储char数组中的第一个字母而不是字符串。程序的其余部分需要路径作为字符串数据类型,因此它不能保留为char数组。我在这里缺少什么?
unsigned long type=REG_SZ, size=1024;
string path;
char res[1024];
HKEY key;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Classes\\dsn\\shell\\open\\command"), NULL, KEY_READ, &key)==ERROR_SUCCESS){
RegQueryValueEx(key,
NULL,// YOUR value
NULL,
&type,
(LPBYTE)res,
&size);
RegCloseKey(key);
path = string(res);
}
答案 0 :(得分:2)
您正在获取Unicode字符串,但将其分配给基于字符的字符串。
您可以将路径的类切换为'tstring'或'wstring',或使用RegQueryValueExA(A代码为ASCII)。
答案 1 :(得分:0)
您正在使用Unicode进行编译。转到项目设置>配置属性>常规并将“字符集”更改为“未设置”,然后重建项目。
RegOpenKey
实际上是WINAPI标头中定义的宏。如果启用了Unicode,则会解析为RegOpenKeyW
,否则会解析为RegOpenKeyA
。如果你想继续在unicode下编译,那么你可以直接调用RetgOpenKeyA
而不是使用宏。
否则,您需要处理Unicode字符串,如果需要,我们也可以帮助您。
答案 2 :(得分:0)
对于C ++,您可能更喜欢使用ATL帮助程序类CRegKey来访问注册表。存储字符串值的方法是QueryStringValue。还有其他(某种)类型安全的方法用于检索和设置不同的注册表值类型。
它不是最好的C ++接口(例如,没有std::string
支持),但比原生Win32更平滑。