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
最近小弟在做一个应用程序,就是仿造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
解决方案 »
- 安装NET Framework 4.0 一般信任关系
- 前台线程和后台线程 -------急
- C#连接数据库超时,我用的是一个存储过程,请指点
- 我用 Visual Studio .NET 开发了个windows 服务不知如何安装打包。
- 报表就叫报表呗,为啥还叫“水晶报表”?
- 清除request对象中的值,
- com+操作2个网段上的数据库为什么不好使?报错:“在分布式事务中登记时出错”,高手帮忙
- 在线等 c#.net代码转换vb.net
- 这样的公司,是否还要继续下去?
- 同样的代码,上面可以运行,下面就不行...大大们帮小弟来看一下啊...
- winform 保存控件的位置信息
- c# datagridview 底部合计
String [] names = rk.GetSubKeyNames();
foreach (String s in names)
{
//输出吧....
}
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个问题
1.子项重复,例如Microsoft SQL Server 10和Microsoft SQL Server 2008 R2都是指同一个软件,类似的还有没?
2.SQL Server 2008 R2 Reporting Services这个应该是一个服务,但仍被识别为已安装软件。360软件管家,不会识别其为软件,是否有键值,能区分服务,和程序
3.补丁程序
http://www.vbforums.com/attachment.php?s=818d9e7c4ef0cebf8842e4ad917ff0d3&attachmentid=76861&d=1268756810以上链接,可以解决本帖提出的3个问题,有需要的TX可以拿去研究,由于回帖的大侠没有解决帖中3个问题,所以不会给分,在此结贴!
感谢大家的帮助!
TOM
非常感谢!
发现用C#调用这个VB库的时候,出来的效果总是跟VB调用VB的时候不一致。最后,发现原来是系统位数的问题。是不是VB.NET用的是32位,而C#默认使用64位呢(针对64位系统)
原来是忘了比较重要的事情,build的时候要注意一定要设成any cpu
靠,写代码写傻了