Visual c++ 如何以编程方式获取已安装程序的列表

Visual c++ 如何以编程方式获取已安装程序的列表,visual-c++,registry,Visual C++,Registry,我正在创建一个程序,该程序首先检查某个特定程序是否已安装,如果已安装,则继续执行其他代码,如果未安装,则安装应用程序,然后继续执行其他代码 如何在VC++中以编程方式检查应用程序是否已安装我有一个C#函数,它可以执行类似的操作,它可以查看注册表中的32位和64位条目。我假设您找到了要查找的程序的正确名称,您所需要的只是将它与“DisplayName”键匹配。我怀疑你会有问题,使它C++ +它会这样的东西 string SoftwareKey = @"SOFTWARE\Microsoft

我正在创建一个程序,该程序首先检查某个特定程序是否已安装,如果已安装,则继续执行其他代码,如果未安装,则安装应用程序,然后继续执行其他代码

如何在VC++中以编程方式检查应用程序是否已安装

我有一个C#函数,它可以执行类似的操作,它可以查看注册表中的32位和64位条目。我假设您找到了要查找的程序的正确名称,您所需要的只是将它与“DisplayName”键匹配。我怀疑你会有问题,使它C++ +它会这样的东西

     string SoftwareKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
     bool found = false;
     RegistryKey rk = Registry.LocalMachine.OpenSubKey(SoftwareKey);

     foreach (string skName in rk.GetSubKeyNames())
     {
        RegistryKey sk = rk.OpenSubKey(skName);

        if (sk.GetValue("DisplayName") != null && 
        sk.GetValue("DisplayName").ToString().Equals("WhateverProgramYouAreLookingFor"))
       {
        //whatever you need to do with it
        found = true;
        break;
        }
     }
    if(!found)
    {
        SoftwareKey = @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall";
        foreach (string skName in rk.GetSubKeyNames())
        {
            RegistryKey sk = rk.OpenSubKey(skName);
            if (sk.GetValue("DisplayName") != null && 
            sk.GetValue("DisplayName").ToString().Equals("WhateverProgramYouAreLookingFor"))
            {
                //whatever you need to do with it
                found = true;
                break;
            }
        }
    }

我也使用这种方法,但我也会跳过父母的密钥(因为它们是服务包、系统更新等)和Office多语言(MUI)包,因为它们不会显示在添加/删除程序中。哦,这是个好主意,我实际上在想一种跳过这些的方法,你如何知道条目是否有子条目?