正在从注册表C++中读取值

Reading a value from the registry C++

本文关键字:读取 C++ 注册表      更新时间:2023-10-16

我想获取应用程序的安装路径。在注册表中,有一个条目提供了我的应用程序的路径,请参阅此屏幕截图:http://i56.tinypic.com/2ly1l6s.jpg

我想读取应用程序所在的路径。换句话说,我想要C:\Projects\MyApplication\MyApplication.exe部分。以下是我要做的:

HKEY hKey;
wchar_t mydata[2048];
DWORD dataLength = sizeof(mydata);
DWORD dwType = REG_SZ;
LPVOID messagecaliss;
LONG regOpenCriss = RegOpenKeyEx(HKEY_CURRENT_USER, "SOFTWARE\Microsoft\Windows\CurrentVersion\Run\", 0, KEY_QUERY_VALUE, &hKey);
GetLastError();
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL, GetLastError(), NULL,(LPTSTR) &messagecaliss, 0, NULL );
if (regOpenCriss == ERROR_SUCCESS) {
RegQueryValueEx(HKEY_CURRENT_USER, "TestApplication", 0, &dwType, (BYTE*)mydata, &dataLength);
wprintf(L"%sn", mydata);
system("PAUSE");
}
else
    MessageBox(NULL,(LPCTSTR)messagecaliss,"ERROR",MB_OK|MB_ICONINFORMATION);

这不起作用,垃圾字符被打印出来。非常感谢。

您使用的是非UNICODE版本的RegQueryValueEx,而您正在使用宽字符版本的printf。使用printf或更改为wprintf(L"%S",mydata)

注意:RegQueryValueEx(HKEY_CURRENT_USER,…)必须是RegQueryValueEx(HKEY,…)

我在之后得到了结果

  1. 我用_T()包围字符串
  2. 我用hKey作为第一个参数调用RegQueryValueEx

您应该将RegQueryValueEx的结果存储在一个变量中并进行检查。处理失败的情况。。。

不起作用

如果不检查RegQueryValueEx的返回值,你怎么知道呢?

垃圾字符打印

没有。这不是垃圾。你没有要求一个宽字符串,所以你不能指望得到一个。在启用Unicode的情况下编译,并使用L"TestApplication"_T("TestApplication")TEXT("TestApplication")调用RegQueryValueExRegQueryValueEx只是RegQueryValueExARegQueryValueExW的typedef,这取决于Unicode是否在编译时定义。

非常感谢

不客气。

您提供的代码的一个主要问题是您有C风格的强制转换。每个演员阵容都是一个bug吸引器。事实上,你的一些类型转换是错误的(隐藏你使用了不兼容的字符类型)。

我想读取应用程序所在的路径。

使用GetModuleFileName

MSDN文档:
检索完全限定路径

干杯&hth。,