#include <iostream>
#include <Windows.h>
using namespace std;
int main(int argc, char** argv)
{
HKEY hKey = {0};
long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\PostgreSQL\\Installations\\postgresql-9.5", 0, KEY_READ, &hKey);
if(ERROR_SUCCESS != lRet)
{
return -1;
}
DWORD dwType = 0;
CHAR szValue[246] = {0};
DWORD valueSize = sizeof(szValue);
lRet = RegQueryValueEx(hKey, "Base Directory", NULL, &dwType, (LPBYTE)&szValue[0], &valueSize);
if(ERROR_SUCCESS != lRet)
{
RegCloseKey(hKey);
return -2;
}
cout << szValue << endl;
(void)RegCloseKey(hKey);
getchar();
return 0;
}
这里需要用到三个API函数:
RegOpenKeyEx
RegQueryValueEx
RegCloseKey
LONG RegOpenKeyEx(
HKEY hKey, // handle to open key // 你需要读取的主键名称如HKEY_LOCAL_MACHINE
LPCTSTR lpSubKey, // address of name of subkey to open // 你需要读取的键值路径(当然不包含前面的主键名称)
DWORD ulOptions, // reserved // Reserved你懂得NULL就行了
REGSAM samDesired, // security access mask // 你搞这个键值干嘛?读还是写自己找宏定义填上。我是KEY_READ。
PHKEY phkResult // address of handle to open key // 打开一个键,这个对象必然需要一个对象句柄,这个就是句柄返回指针
);
LONG RegQueryValueEx(
HKEY hKey, // handle to key to query // 前面返回的句柄,这里拿来读键值
LPTSTR lpValueName, // address of name of value to query // 键是指注册表左侧半边窗,键值是指右半边
// so前面路径只能指示最终路径,这里指定路径下的具体哪一个键值(放心后面有栗子)
LPDWORD lpReserved, // reserved // 不要值必然NULL了
LPDWORD lpType, // address of buffer for value type // 对应搞个DWORD变量再&一下。这个和下面两个是重要的返回值。
LPBYTE lpData, // address of data buffer // 同上一个。最重要:数据缓存区!!
LPDWORD lpcbData // address of data buffer size // 同上一个。次重要:数据缓存区长度。
); // 就是通过后两个参数读出键值数据的
LONG RegCloseKey(
HKEY hKey // 释放键的句柄
);