Dear all,
  最近小弟在做一个应用程序,就是仿造360软件管家,获取计算机里已安装软件列表,
  现思路如下,根据注册表路径:
  针对x86系统,HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
  针对x64系统,HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
  分别获取已安装软件列表,然后按照以下步骤进行处理:
  1.剔除service项,重复项,已安装补丁,如KB开头的子项(计划中,未能实现)
  2.合并x86,x64.最终得到软件列表数据
  遇到的问题,
  1.该实现思路是否正确?
  2.思路正确的前提下,如何解决识别为service,重复项,补丁等子项  恳请大侠指教?
TOM
  
  
    

解决方案 »

  1.   

    Microsoft.Win32.RegistryKey   rk   =   Microsoft.Win32.Registry.LocalMachine.OpenSubKey( "SOFTWARE ");
    String   []   names   =   rk.GetSubKeyNames();
    foreach   (String   s   in   names)  
    {
    //输出吧....
    }
      

  2.   

    可以用Installer API,详细文档见http://msdn.microsoft.com/en-us/library/aa369426(v=VS.85).aspx。
    static void Main()
    {
        StringBuilder result = new StringBuilder();
        for (int index = 0; ; index++)
        {
            StringBuilder productCode = new StringBuilder(39);
            if (MsiEnumProducts(index, productCode) != 0)
            {
                break;
            }        foreach (string property in new string[] { "ProductName", "Publisher", "VersionString", })
            {
                int charCount = 512;
                StringBuilder value = new StringBuilder(charCount);            if (MsiGetProductInfo(productCode.ToString(), property, value, ref charCount) == 0)
                {
                    value.Length = charCount;
                    result.AppendLine(value.ToString());
                }
            }
            result.AppendLine();
        }
        Console.WriteLine(result.ToString());
    }
           
    [DllImport("msi.dll", SetLastError = true)]
    static extern int MsiEnumProducts(int iProductIndex, StringBuilder lpProductBuf);[DllImport("msi.dll", SetLastError = true)]
    static extern int MsiGetProductInfo(string szProduct, string szProperty, StringBuilder lpValueBuf, ref int pcchValueBuf);
      

  3.   


    思路这样,但还得解决那3个问题
    1.子项重复,例如Microsoft SQL Server 10和Microsoft SQL Server 2008 R2都是指同一个软件,类似的还有没?
    2.SQL Server 2008 R2 Reporting Services这个应该是一个服务,但仍被识别为已安装软件。360软件管家,不会识别其为软件,是否有键值,能区分服务,和程序
    3.补丁程序
      

  4.   

    To dear all,
    http://www.vbforums.com/attachment.php?s=818d9e7c4ef0cebf8842e4ad917ff0d3&attachmentid=76861&d=1268756810以上链接,可以解决本帖提出的3个问题,有需要的TX可以拿去研究,由于回帖的大侠没有解决帖中3个问题,所以不会给分,在此结贴!
    感谢大家的帮助!
    TOM
      

  5.   

    你好,我现在遇到的问题和你提到的一样,我想剔除service项,重复项,已安装补丁等···也看了你后面提供的可下载的附件,没看太明白,本人刚开始学习,不知道可否大致给讲一下思路?
    非常感谢!
      

  6.   

    用上面的代码调试了很久。
    发现用C#调用这个VB库的时候,出来的效果总是跟VB调用VB的时候不一致。最后,发现原来是系统位数的问题。是不是VB.NET用的是32位,而C#默认使用64位呢(针对64位系统)
      

  7.   


    原来是忘了比较重要的事情,build的时候要注意一定要设成any cpu
    靠,写代码写傻了