2011-06-12 91 views
5

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

我想读取我的应用程序所在的路径。换句话说,我想要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"%s\n", mydata); 
system("PAUSE"); 
} 
else 
    MessageBox(NULL,(LPCTSTR)messagecaliss,"ERROR",MB_OK|MB_ICONINFORMATION); 

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

+0

指定您使用的编译器/开发工具可能很有用。 – vsz 2011-06-12 21:57:26

+0

我使用Visual Studio C++ 2010,Windows 7 – 2011-06-12 22:05:25

+0

来自argv []的路径有什么问题? – Andrei 2011-06-12 22:21:11

回答

5

您正在使用非UNICODE版本o RegQueryValueEx,并且您正在使用宽字符版本的printf进行扩展。无论是使用printf或者改变wprintf(L “%S”,MYDATA)

注:的RegQueryValueEx(HKEY_CURRENT_USER,...)必须的RegQueryValueEx(的hKey,...)

+0

printf什么都不打印 – 2011-06-12 22:26:15

+0

您查询的值是否存在?如果是这样,请检查RegQueryValueEx的返回值。 – 2011-06-12 22:32:22

+0

并检查dwType是否已设置为[REG_SZ](http://msdn.microsoft.com/en-us/library/ms724884(v = VS.85).aspx)。 – 2011-06-12 22:50:09

1

我之后得到的结果:

  1. 我周围的琴弦用_T()
  2. 我叫RegQueryValueExhKey作为第一个参数

你应该存储结果的RegQueryValueEx在一个变量中,并检查它。处理失败案例...

0

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

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

使用GetModuleFileName

MSDN docs
获取完全合格的路径

干杯&心连心,

+0

啊,我讨厌荷尔蒙的孩子。为什么上帝不给他们思想? – 2011-06-12 23:21:14

+0

我不是downvoter,但我认为OP是要求安装一些“其他”应用程序,而不是当前正在运行的应用程序。所以GetModuleFileName将无济于事。 – 2011-06-12 23:59:28

+0

@Guy:他确实写了“我的申请”,而不是“其他申请”。但很有可能你是对的,他正在想别的东西,而不是他实际上要求的。注册表代码指向那个方向,是的 - 但另一方面,也指向不知道“GetModuleFileName”的方向... ;-) – 2011-06-13 00:02:23

1

这不起作用

你怎么知道没有。检查返回值RegQueryValueEx

垃圾字符打印

号这不是垃圾。你没有要求一个宽字符串,所以你不能指望得到一个。使用Unicode编译并启用RegQueryValueExL"TestApplication"_T("TestApplication")TEXT("TestApplication")RegQueryValueEx只是RegQueryValueExARegQueryValueExW的typedef,具体取决于编译期间是否定义了Unicode。

非常感谢您

不客气。

+1

+1来对抗无意识的驾驶者downvoter。 – 2011-06-12 23:24:27

+0

你是最亲切的。 ;) – 2012-08-21 09:08:36