当前位置:编程学习 > C/C++ >>

注册表操作总结

示例程序一:读取注册表获取计算机上已安装程序的信息
 
Windows 系统中,安装程序都可以在注册表 HKEY_LOCAL_MACHINE\SoftWare\Microsoft\Windows\CurrentVersion\Uninstall 获取,并且xp、vista、win7、win8都一样
 
以下示例程序中:
 
结构体ApplicationInfoA用于记录每个安装程序的具体信息,至于为何在名称后面加A,主要是为了表明其下的信息全是用string记录的。
 
函数GetAllInstalledAppInfoA用于获取计算机上已安装程序的全部信息,它接受vector<ApplicationInfoA>引用类型的参数,并将获取的全部信息存放在该vector中。该程序执行成功返回0,执行失败则返回-1。
 
main()函数中演示了怎么使用:
 
vector<ApplicationInfoA> vAppInfo;     
 
GetAllInstalledAppInfoA(vAppInfo);
 
在获取了安装程序的信息后,输出到D盘下的InstalledAppInfo.txt文件中。
 
 
 
[cpp]  
#include <windows.h>  
#include <iostream>  
#include <TCHAR.H>  
#include <vector>  
  
using namespace std;  
  
//  
// 用于记录安装软件信息的结构体  
//  
struct ApplicationInfoA  
{  
    string strName;            // 软件名  
    string strDisplayName;     // 显示的软件名  
    string strPublisher;       // 发布者  
    string strVersion;         // 版本  
    string strDisplayVersion;  // 显示的版本  
    string strInstallLocation; // 安装的位置  
};  
  
//  
// 获取具体的程序的键值Data  
// hKey [in]  
//     --- 指向HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall的子键句柄  
// lpszKeyValueName [in]  
//     --- hKey下面的子键名称  
// lpszKeyValueName [in]  
//     --- 正如其名,键值的名称  
// strKeyValue [out]  
//     --- 键值的Data  
//  
int _GetAppInfoA_(HKEY hKey, LPCSTR lpszAppName, LPCSTR lpszKeyValueName, string& strKeyValue)  
{  
    int ret;  
  
    // 打开已安装软件的注册表键------------------------------------------------  
    HKEY hInstallAppKey;  
    ret = RegOpenKeyEx(hKey, lpszAppName, 0, KEY_ALL_ACCESS, &hInstallAppKey);  
    if (ret != ERROR_SUCCESS)  
    {  
        return -1;  
    }  
  
    // 获取已安装软件的注册表键的键值------------------------------------------  
    // 1.获取字符串大小(默认为字符串即REG_SZ)  
    DWORD dwKeyValueType = REG_SZ;  
    DWORD dwKeyValueDataSize = 0;  
    ret = RegQueryValueExA(  
        hInstallAppKey,  
        lpszKeyValueName,  
        NULL,  
        &dwKeyValueType,  
        NULL,  
        &dwKeyValueDataSize);  
    if (ret == ERROR_FILE_NOT_FOUND)  
    {  
        RegCloseKey(hInstallAppKey);  
        return 0;  
    }  
    else if (ret != ERROR_SUCCESS)  
    {  
        RegCloseKey(hInstallAppKey);  
        return -1;  
    }  
  
    // 2.获取字符串值  
    if (dwKeyValueType != REG_SZ)   // 如果不是字符串类型则返回,有的安装程序此项不为字符串而为其他类型,忽略  
    {  
        RegCloseKey(hInstallAppKey);  
        return 0;  
    }  
    LPSTR lpszKeyValueData = new char[dwKeyValueDataSize + 1];  
    memset(lpszKeyValueData, 0, dwKeyValueDataSize + 1);  
    ret = RegQueryValueExA(  
        hInstallAppKey,  
        lpszKeyValueName,  
        NULL,  
        &dwKeyValueType,  
        (LPBYTE)lpszKeyValueData,  
        &dwKeyValueDataSize);  
    if (ret != ERROR_SUCCESS)  
    {  
        delete[] lpszKeyValueData;  
        RegCloseKey(hInstallAppKey);  
        return -1;  
    }  
    strKeyValue = lpszKeyValueData;  
    delete[] lpszKeyValueData;  
  
    // 关闭注册表键------------------------------------------------------------  
    RegCloseKey(hInstallAppKey);  
  
    return 0;  
}  
  
  
//  
// 获取系统安装的程序信息并存储于参数vector中  
// 成功执行返回0  
// 执行失败则返回-1  
//  
int GetAllInstalledAppInfoA(vector<ApplicationInfoA>& vAppInfo)  
{  
    int ret;  
  
    // 打开注册表键------------------------------------------------------------  
    HKEY hKey;  
    LPCSTR lpszSubKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";  
    ret = RegOpenKeyExA(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);  
    if (ret != ERROR_SUCCESS)  
    {  
        return -1;  
    }  
  
    // 获取子键&键值信息-------------------------------------------------------  
    DWORD dwSubKeysCnt;           // 子键数量  
    DWORD dwMaxSubKeyNameLen;     // 子键名字的最大长度(not including the terminating null character)  
    DWORD dwKeyValueCnt;          // 键值的数量  
    DWORD dwMaxKeyValueNameLen;   // 键值名字的最大长度(not including the terminating null character)  
    DWORD dwMaxKeyValueDataLen;   // 键值数据的最大长度(in Bytes)  
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,