Contents

C++ Get the program installation path

注册表查询

在运行里面输入:regedit,打开注册表编辑器。

软件的安装路径查询一般在HKEY_LOCAL_MACHINE\SOFTWARE里面。

以Firefox浏览器为例,路径为**\HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox\67.0.4 (x64 zh-CN)\Main**,里面的**Install Directory**则保存了软件的安装路径。

C++ 编程实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <windows.h>
using namespace std;
int main(void)
{
#define MY_BUFSIZE 128 // Arbitrary initial value.
	// Dynamic allocation will be used.
	HKEY hKey;
	TCHAR szProductType[MY_BUFSIZE];
	DWORD dwBufLen = MY_BUFSIZE;
	LONG lRet;
	// 下面是打开注册表, 只有打开后才能做其他操作
	lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, // 要打开的根键
		TEXT("SOFTWARE\\Mozilla\\Mozilla Firefox\\67.0.4 (x64 zh-CN)\\Main"), // 要打开的子子键(火狐版本67.0.4 (x64 zh-CN))
		0, // 这个一定要为0
		KEY_QUERY_VALUE, // 指定打开方式,此为读
        //KEY_QUERY_VALUE|KEY_WOW64_64KEY, // 32位程序非要获取64位的注册表需要在打开键时,添加参数KEY_WOW64_64KEY
		&hKey); // 用来返回句柄
	if (lRet == ERROR_SUCCESS) // 判断是否打开成功
	{
		cout << "打开注册表成功" << endl;
	}
	else {
		cout << "打开注册表失败" << endl;
		return 1;
	}
		
	// 下面开始查询
	lRet = RegQueryValueEx(hKey, // 打开注册表时返回的句柄
		TEXT("Install Directory"), //要查询的名称,Firefox安装目录记录在这个里面
		NULL, // 一定为NULL或者0
		NULL,
		(LPBYTE)szProductType, // 我们要的东西放在这里
		&dwBufLen);
	if (lRet == ERROR_SUCCESS) // 判断是否查询成功
	{
		cout << "获得安装目录成功" << endl;
		RegCloseKey(hKey);
		cout << (char*)szProductType << endl;
	}
	else
	{
		cout << "获得安装目录失败" << endl;
		return 1;
	}
	
}

注意:32位程序非要获取64位的注册表需要在打开键时,添加参数KEY_WOW64_64KEY,我一开始用的VS2019 ×86 来运行程序,始终找不到注册文件,换成×64即可运行找到,如果用×86编译,一定要加上参数KEY_WOW64_64KEY才能获得正常的路径找到注册文件!!!

结果截图: