这几天一直被读取本地计算机中的安装程序列表这个问题搞的头昏脑涨。
在开始的时候,我本来是想找个Open Source的软件来搞定这个问题的,但是找了好久也没有能用的,更不要说找个能够被调用的啦!于是自己就想办法看看能不能把这个问题搞定!
在网上找了好久 ,找到了一个非常有用的信息 ,那就是计算机中所有的安装程序在存在在注册表中,路径是:HKEY_LOCAL_MACHINE SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall。在这个键下面的所有子键就是在本地计算机中的所有的安装程序,而所有的程序名存储在DisplayName字段中。
由于在开始时,需要用JAVA来实现,所以就在网上找到了一个Sigar.jar,全称是org.hyperic.sigar,在这个包下面有个类RegistryKey,路径是org.hyperic.sigar.win32.RegistryKey。
使用Java的实现时,首先必须先包含Sigar.jar,实现过程如下:
public String[] getDisplayNames()
{
String[] namesList=null;
String[] displayNames=null;
try
{
RegistryKey rk=RegistryKey.LocalMachine.openSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall");//用于打开注册表目录。
namesList=rk.getSubKeyNames();//获取注册表中的所有子键名。
displayNames=new String[namesList.length];
for(int i=0;i<namesList.length;i++)
{
RegistryKey subrk=rk.openSubKey(namesList[i]);
displayNames[i]=subrk.getStringValue("DisplayName", "nothing"); ;//获取displayName。其中第二个参数"Nothing"为"DisplayName"的默认值,如果"DisplayName"不存在,则"DisplayName"的值为"Nothing"。
}
}
catch(Exception err)
{
}
return displayNames;//返回
}
使用C#的实现过程如下:
public string[] getDisplayNames()
{
Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");//用于打开注册表目录。
String[] keyNames = rk.GetSubKeyNames();//获取注册表中的所有子键名。
String[] displayNames = new String[keyNames.Length];//声明用于存储displayName的字符串数组。
for (int i = 0; i < keyNames.Length; i++)//用于循环读取DisplayName
{
Microsoft.Win32.RegistryKey subkey = rk.OpenSubKey(keyNames[i]);//根据子键名,来打开子键。
string displayName = subkey.GetValue("DisplayName", "Nothing").ToString();//获取displayName。其中第二个参数"Nothing"为"DisplayName"的默认值,如果"DisplayName"不存在,则"DisplayName"的值为"Nothing"。
displayNames[i] = displayName; //对数组赋值
}
return displayNames;//返回
}
在读取了DisplayName字段之后,也并不意味着读取了正确的程序名。DisplayNames中存在一些值为Nothing的情况, 而且也存在Windows的安装更新程序,这就需要对DisplayNames中的某些值进行过滤。
最后有一点需要说明的是,这种读取注册表的方法只能在windows系统中使用。
分享到:
相关推荐
在IT领域,开发人员经常需要获取计算机的硬件信息和已安装软件列表,以便进行系统监控、故障排查或软件管理。Delphi是一款强大的Object Pascal集成开发环境,它提供了丰富的API和库来实现这样的功能。以下是对如何...
"JAVA查看安装软件列表(axun)"项目提供了一个实用的解决方案,它是一个小型的Java应用程序,允许开发者或者用户查看计算机上已安装的软件详细信息。 首先,要实现这个功能,Java需要访问操作系统级别的API,这通常...
标题中的“DNS Client Events错误尝试读取本地主机文件时出错”是指在Windows操作系统中,DNS客户端服务在尝试访问和解析本地计算机的主机文件(也称为“hosts”文件)时遇到的问题。这个问题可能会导致网络连接故障...
在C#编程中,读取本地用户涉及到操作系统安全和身份验证的概念。这通常与Windows操作系统中的用户账户管理和权限控制紧密相关。以下是一些关键知识点: 1. **Windows身份验证**:Windows操作系统使用一种称为“安全...
这些文件可能来源于用户的本地计算机,并通过Web页面上传至服务器。为了实现这一功能,通常的做法是将文件内容转换为字节数组(byte array),再传递给后端进行进一步处理。这种方式不仅适用于Web应用程序,也便于与...
在本场景中,"mimicom.idl"可能是一个与中间人攻击相关的组件,IDL(Interface Definition Language)文件用于定义不同软件组件之间的接口,可能是为了实现网络通信中的密码拦截。 "kiwi_passwords.yar"可能是一个...
在文件列表中,"pspv.exe"可能是该工具的可执行文件,它在Windows操作系统上运行。"readme.txt"通常包含软件的使用说明、许可信息或开发者联系方式,对于理解如何操作该工具至关重要。 在使用“本地保存密码读取...
本地密码储存读取器作为一种实用工具,它旨在帮助用户方便、安全地管理和读取存储在本地计算机上的密码。本文将深入探讨这个工具的功能、工作原理以及其在日常使用中的应用。 首先,我们要理解什么是“本地密码储存...
标题中的问题涉及到的是在执行与Excel交互操作时遇到的一个常见错误,即“未在本地计算机上注册‘microsoft.ACE.oledb.12.0’提供程序”。这个错误通常是由于缺少Microsoft Access Database Engine(也称为ACE OLEDB...
标题中的“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序。 (System.Data)”是一个常见的错误信息,通常出现在尝试使用Access数据库引擎(ACE.OLEDB.12.0)连接到Microsoft Access数据库时。这个错误...
总之,“未在本地计算机注册“Microsoft.ACE.OLEDB.12.0”提供程序”的错误通常可以通过安装相应的Access Database Engine组件并正确配置应用程序来解决。确保操作系统的位数与安装的组件匹配,并遵循正确的注册和...
3. **读取本地图片文件**:使用Emgu.CV,你可以轻松地加载本地图片。在C#代码中,创建一个`Image, byte>`类型的变量,然后调用`Image.FromFile()`方法,传入图片文件路径即可。 ```csharp Image, byte> image = ...
以下是一个简单的Qt程序,用于读取本地图像并显示: ```cpp #include #include #include int main(int argc, char *argv[]) { QApplication app(argc, argv); QLabel label; label.setWindowFlags(Qt::...
在C#中,获取本地计算机的IP地址通常涉及到网络编程的相关类库。我们可以使用`System.Net.NetworkInformation`命名空间下的`NetworkInterface`和`UnicastIPAddressInformation`类来获取。首先,通过`Network...
在各种编程语言中,都有专门的API用于读取本地文件。以下是一些常见编程语言的文件读取函数: 1. Python: - `open()` 函数,例如:`file = open('filename.txt', 'r')`,'r' 表示读取模式。 - 使用 `read()`、`...
标题中的“本地Wireless密码读取工具”是指一种软件或技术,主要用于Windows操作系统环境中,能够方便快捷地获取本地计算机上已连接过的无线网络的密码。这类工具通常适用于用户忘记无线网络密码,但又需要重新连接...
总的来说,理解和解决"未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序"的错误,对于在SQL环境中进行Excel数据操作是至关重要的。正确安装和配置ACE OLEDB提供程序,可以有效提升数据处理的效率和便利性...
在VC++编程环境中,获取本地计算机的名称是常见的系统信息查询任务。这涉及到Windows API的使用,特别是关于网络和系统信息的部分。以下是一份详细的知识点解析,将介绍如何使用VC++来实现这一功能。 首先,我们...
本文将详细阐述如何通过本地计算机使用C#语言和SQL技术来远程访问其他计算机上的SQL Server数据库。 首先,要实现这一目标,我们需要确保两台计算机之间网络通信正常,并且远程计算机上的SQL Server服务已经开启了...
本篇将详细介绍如何利用易语言来检测本地计算机上已经安装的应用程序。 首先,我们需要了解易语言的基本结构。易语言的核心思想是“易”,它采用直观的中文词汇作为编程关键字,降低了学习编程的门槛。在易语言中,...