【发布时间】:2012-09-05 14:10:17
【问题描述】:
我正在尝试获取计算机上已安装软件的图标。
已安装的软件列表是从此注册表路径填充的: HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
根据 DisplayName 排除重复项。
现在我尝试从键 DisplayIcon 中获取图标。如果它存在。 DisplayIcon 中的值因软件而异。一些例子是休闲:
- D:\Program Files\FileZilla FTP Client\FileZilla.exe
- C:\Program Files\Common Files\Microsoft Shared\OFFICE12\Office Setup Controller\OSETUP.DLL,1
- D:\Program Files\Fiddler2\IE_Toolbar.ico
- dfshim.dll,2
- D:\Program Files\Winamp\winamp.exe,0
- etc\git.ico
对于所有这些示例,我都可以使用图标。如果 InstallLocation + DisplayIcon 不是真正的来源,我可以在 InstallLocation 中搜索 DisplayIcon 名称(例如:GetDataBackFor* 的 DisplayIcon 是 gdbnt.exe,所以我搜索这个,如果找到我就拿他的图标)
问题是其他应用程序(如 revo 或 windows 卸载程序)如何获取没有 DisplayIcon 键的应用程序的图标。他们只有根目录的 InstallLocation。他们在那个位置搜索ico或exe?如果它们是多个可执行文件并且该可执行文件的名称看起来不像 DisplayName,该怎么办?如果注册表中没有此类信息,他们如何从主可执行文件中汇集图标? 此类应用的示例包括 Google 地球、Apple 软件更新等。
【问题讨论】:
-
你不明白这个问题,或者我解释得很糟糕。问题在于那些没有关于图标的任何信息的程序(可执行文件、图标、InstallLocation 中只有一个可执行文件)。
-
你是对的。我误解了这个问题。 :-) 在您展示的示例中,它是指示的图标:对于 FileZilla.exe,找到的第一个图标;对于 Office,OSETUP.DLL 中索引 1 处的图标;对于 Fiddler2,它是在安装路径下的 `etc` 文件夹中找到的图标文件
IE_Toolbar.ico' itself; for Winamp, it's the first icon found (index 0) in Winamp.exe; the final one is for the icon filegit.ico`。 -
没错,对于那些场景,我可以使用图标。但是有一些程序,如谷歌地球,没有任何信息可以帮助在注册表中获取图标。无论如何,revo 卸载程序和 Windows 卸载程序可以以某种方式获取图标......我不知道如何。跨度>
-
这是我获取已安装程序的课程。这不是完美的解决方案,但时间是一个问题。也许它会帮助你。 gist.github.com/andySF/19f3569b50db18095a3d