从注册表中取值(Windows平台)
本篇文章的内容是从Windows平台的注册表里取值
程序开发一般都会涉及从注册表获取相关信息,我将以从注册表获取软件的安装路径为例子
一、需求
我现在要获取微信的安装路径,如图所示:
二、具体步骤
1.打开注册表
代码如下:
LONG lRet;
lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, // 要打开的根键
TEXT("SOFTWARE\\WOW6432Node\\Kingsoft\\Office\\6.0\\Common"), // 要打开的子键
0, // 这个一定要为0
KEY_QUERY_VALUE, // 指定打开方式,此为读
&hKey); // 用来返回句柄
if (lRet != ERROR_SUCCESS){
std::cout << "路径打开失败"; // 判断是否打开成功
return NULL;
}
2.查询内容
代码如下:
lRet = RegQueryValueEx(hKey, // 打开注册表时返回的句柄
TEXT("InstallRoot"), //要查询的名称,安装目录记录在这个保存 (即想要获取的值的名字)
NULL, // 一定为NULL或者0
NULL,
(LPBYTE)szProductType, // 我们要的东西放在这里(用于装载取回数据类型的一个变量)
&dwBufLen);//接收返回值的返回地址(用于装在指定值的一个缓冲区)
if (lRet != ERROR_SUCCESS) std::cout << "查询失败!!!"; // 判断是否查询成功
完整代码
代码如下:
#include <windows.h>
#include <iostream>
#include <string>
std::string getPath();
int main(){
std::cout<<getPath();
system("pause");
}
std::string getPath() {
constexpr auto MY_BUFSIZE = 256;//动态分配
HKEY hKey;
TCHAR szProductType[MY_BUFSIZE];
memset(szProductType, 0, sizeof(szProductType));//数组清零操作
DWORD dwBufLen = MY_BUFSIZE;
LONG lRet;
// 下面是打开注册表, 只有打开后才能做其他操作
lRet = RegOpenKeyEx(HKEY_CURRENT_USER, // 要打开的根键
TEXT("SOFTWARE\\Tencent\\WeChat"), // 要打开的子键
0, // 这个一定要为0
KEY_QUERY_VALUE, // 指定打开方式,此为读
&hKey); // 用来返回句柄
if (lRet != ERROR_SUCCESS) {
std::cout << "路径打开失败"; // 判断是否打开成功
return NULL;
}
//下面开始查询
lRet = RegQueryValueEx(hKey, // 打开注册表时返回的句柄
TEXT("InstallPath"), //要查询的名称,安装目录记录在这个保存 (即想要获取的值的名字)
NULL, // 一定为NULL或者0
NULL,
(LPBYTE)szProductType, // 我们要的东西放在这里(用于装载取回数据类型的一个变量)
&dwBufLen);//接收返回值的返回地址(用于装在指定值的一个缓冲区)
if (lRet != ERROR_SUCCESS) std::cout << "查询失败!!!"; // 判断是否查询成功
RegCloseKey(hKey);//关闭句柄
char ansi[MY_BUFSIZE];
WideCharToMultiByte(CP_ACP, 0, szProductType, -1, ansi, sizeof(ansi), NULL, NULL);//转换
return ansi;
}