C++编程读取注册表文件
下边是通过读取注册表获取360安装路径的过程
regopenkeyex
https://docs.microsoft.com/en-us/windows/desktop/api/winreg/nf-winreg-regopenkeyexa
打开指定的注册表项。请注意,键名称不区分大小写。
如果函数成功,则返回值为ERROR_SUCCESS。
RegQueryValueEx
检索与打开的注册表项关联的指定值名称的类型和数据。
如果函数成功,则返回值为ERROR_SUCCESS。
完整代码
LPCTSTR lpSubKey;//查询时的子键
HKEY RootKey;//查询时的主键
HKEY hkResult;//查询注册表的结果
LONG lRet;
DWORD index = 0;
DWORD dwKeyLen = 255;
DWORD dwType = REG_BINARY | REG_DWORD | REG_EXPAND_SZ | REG_MULTI_SZ | REG_NONE | REG_SZ;
TCHAR szBuffer[255] = { 0 };
DWORD dwNameLen = 255;
RootKey = HKEY_USERS;
CString sid;
getSID(sid);
sid+= _T("\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\360se6");
cout << "lpSubKey : " << sid << endl;
lpSubKey = sid;
cout << "lpSubKey : " << lpSubKey << endl;
//下面是打开注册表, 只有打开后才能做其他操作
//主键和子键共同组成了注册表中的目录
lRet = RegOpenKeyEx(RootKey, lpSubKey, 0, KEY_ALL_ACCESS, &hkResult);
cout << "lRet : " << lRet << endl;
if (lRet == ERROR_SUCCESS) // 判断是否打开成功
{
cout << "retOpen : " << lRet << endl;
LONG retOpen = RegQueryValueEx(hkResult, _T("InstallLocation"), 0, &dwType, (LPBYTE)szBuffer, &dwNameLen);//通过上边的注册表截图可以看到,通过"InstallLocation"可以找到对应的路径信息
cout << "retOpen : " << retOpen << endl;
cout << "szBuffer : " << szBuffer << endl;
RegCloseKey(hkResult);
}
其中的SID()是为了获取用户的SID,实现如下
void getSID(CString &sid)
{
char userName[MAX_NAME] = "";
char sid1[MAX_NAME] = "";
char sid2[MAX_NAME] = "";
char sid3[MAX_NAME] = "";
char sid4[MAX_NAME] = "";
char sid5[MAX_NAME] = "";
char sid6[MAX_NAME] = "";
DWORD nameSize = sizeof(userName);
GetUserName((LPSTR)userName, &nameSize);
char userSID[MAX_NAME] = "";
char userDomain[MAX_NAME] = "";
DWORD sidSize = sizeof(userSID);
DWORD domainSize = sizeof(userDomain);
SID_NAME_USE snu;
LookupAccountName(NULL,
(LPCSTR)userName,
(PSID)userSID,
&sidSize,
(LPSTR)userDomain,
&domainSize,
&snu);
PSID_IDENTIFIER_AUTHORITY psia = GetSidIdentifierAuthority(userSID);
sidSize = sprintf_s(sid1, "S-%lu-", SID_REVISION);
sidSize += sprintf_s(sid2, "%-lu", psia->Value[5]);
sid += sid1;
sid += sid2;
int i = 0;
int subAuthorities = *GetSidSubAuthorityCount(userSID);
for (i = 0; i < subAuthorities; i++)
{
char sid7[MAX_NAME] = "";
sidSize += sprintf_s(sid7, "-%lu", *GetSidSubAuthority(userSID, i));
sid += sid7;
}
cout << sid << endl;
}