获取已安装的软件列表

时间:2011-05-09 05:05:53

标签: c# c

  

可能重复:
  Get Installed software list

如何使用C获取已安装的应用程序软件列表?我有一个C#的解决方案。这是C#代码:

System Microsoft.Win32 
private string Getinstalledsoftware() {
    string Software = null; 
    string SoftwareKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; 
    using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(SoftwareKey)) { 
        foreach (string skName in rk.GetSubKeyNames()) { 
            using (RegistryKey sk = rk.OpenSubKey(skName)) { 
                try { 
                    if (!(sk.GetValue("DisplayName") == null)) { 
                        if (sk.GetValue("InstallLocation") == null) 
                            Software += sk.GetValue("DisplayName") + " - Install path not known\n";
                        else 
                            Software += sk.GetValue("DisplayName") + " - " + sk.GetValue("InstallLocation") + "\n"; 
                    } 
                } 
                catch (Exception ex) { 
                }
            }
        } 
    } 
    return Software; 
}

如何将C#代码转换为C代码?

2 个答案:

答案 0 :(得分:2)

如果您希望执行翻译,则需要将此处执行的操作映射到相应的Windows API registry functions和其他string manipulation函数。

否则您可以使用Windows Installer API直接执行此操作。

以下是使用安装程序API转储产品的示例:

#include <stdio.h>
#include <Windows.h>
#include <Msi.h>

static UINT msierrno;

#define PRODUCT_NAME_SIZE 512
#define INSTALL_LOCATION_SIZE 512

int main(void)
{
    DWORD index;
    TCHAR productCode[39];
    for (index = 0; (msierrno = MsiEnumProducts(index, productCode)) == ERROR_SUCCESS; index++)
    {
        TCHAR productName[PRODUCT_NAME_SIZE];
        TCHAR installLocation[INSTALL_LOCATION_SIZE];
        DWORD productNameSize = PRODUCT_NAME_SIZE;
        DWORD installLocationSize = INSTALL_LOCATION_SIZE;

        wprintf(L"product code: %s\n", productCode);
        if ((msierrno = MsiGetProductInfo(productCode, INSTALLPROPERTY_INSTALLEDPRODUCTNAME, productName, &productNameSize)) != ERROR_SUCCESS)
        {
            /* handle error */
        }
        else wprintf(L"\tproduct name: %s\n", productName);
        if ((msierrno = MsiGetProductInfo(productCode, INSTALLPROPERTY_INSTALLLOCATION, installLocation, &installLocationSize)) != ERROR_SUCCESS)
        {
            /* handle error */
        }
        else wprintf(L"\tinstall location: %s\n", installLocation);
    }
    return 0;
}

p.s。,您需要链接到msi.lib / dll库。

答案 1 :(得分:1)

你可以这样:

  1. 使用.NET Reflector查看注册表函数的实际实现方式,然后
  2. 查看Microsoft Registry Functions以在C / C ++中使用它们。
  3. 当然,您也可以在没有第1步的情况下直接转到第2步。