C++编程读取注册表文件

C++编程读取注册表文件

C++通过访问注册表获取已安装软件信息列表

C++编程实现从注册表中获取程序安装路径并调用exe文件

下边是通过读取注册表获取360安装路径的过程

regedit-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;
}

猜你喜欢

转载自blog.csdn.net/lee_ham/article/details/81778517