从独立于开源平台的Java代码替换Windows * .exe中的图标

首先,这不是从Java类生成EXE的常见问题的重复。 我不需要这样做。

要解决NetBeans RFE#64612而不需要手动步骤,我需要一个Java(6+)库,它可以获取现有的 Windows *.exe文件,并用通用格式的替换替换其图标。 可执行文件是通用的并且是预构建的(以二进制forms分发),已经知道如何加载特定于应用程序的配置文件,然后使用各种应用程序JAR等启动JRE。 唯一的问题是它有一个通用图标,我想将该图标替换为纯Java构建的一部分,并带有特定于应用程序的图标,因此它看起来更漂亮。

该库必须在非病毒开源许可下提供; 跨平台(必须在Windows,Linux,Mac,Solaris上运行),因此无法分叉某些特定于操作系统的帮助工具; 并且必须接受PNG输入,尽管EXE必须在XP上工作,因此根据Wikipedia应该嵌入BMP格式。 在高层次上,假设Ant作为构建工具,我想要这样的东西:

有谁知道是否已经存在符合这些规范的工具? 从各种网络搜索我发现Launch4J ,但这似乎只是为实际工作分叉,因此不是简单的便携式。 我发现JSmooth看起来更有前途 – 似乎包含了处理ICO编解码器和操作PE文件的Java代码 – 但它是GPL。 WinRun4J看起来使用本机代码进行图标操作,尽管我很难跟踪它的来源。 据说吉米处理ICO格式(标准的javax.imageio似乎也是这样)但我想没有更新PE资源的工具。

根据我的Eclipse Rich Client Platform产品构建器,

  • Linux需要XPM图标
  • MacOSX需要ICNS文件
  • Solaris需要4 PM图标,大,中,小和小
  • Windows(32位)需要6个单独的BMP图像或ICO文件。

您的分发包必须包含所有这些文件才能与平台无关。

我没有使用其他平台,但在Windows上,您可以通过右键单击现有图标并左键单击“属性”来更改程序图标。 左键单击“快捷方式”选项卡,然后左键单击“更改图标”按钮。 浏览到分发目录,然后选择ICO文件。

我确信在交付分发包时可以自动执行Windows图标更改。 我想在其他平台上也有可能。

PE / COFF 4J项目似乎可以做你想要的。 它根据通用公共许可证(CPL)获得许可 。

一些注意事项:

  • 作者似乎与WinRunJ相同。 这个项目实际上有一个PE资源编辑器,名为RCEDIT.exe ,但是当你自己指出时它会使用本机的Windows调用。 为什么作者没有使用他自己的项目(PE / COFF 4J)来实现这一目标。 它让我有些担心,也许PE / COFF 4J项目被放弃了。

  • PE / COFF 4J的文档页面仅提到项目能够解析PE文件,但是我可以告诉您可以解析文件,然后更改某些内容(例如图标资源),然后将图像写回磁盘。

和你一样,我也一直在寻找一种纯Java解决方案,它可以操纵.EXE(PE文件)中的资源并空手而归。 这是迄今为止最好的选择。

使用本机Win32调用时,替换.EXE文件中的图标资源非常简单。 从纯Java执行此操作时,您必须确保在将文件写回磁盘时PE文件是一致的。 我没有仔细审查PE文件格式,但我想在更换/添加资源时会有许多引用会改变,而不仅仅是与您要替换/添加的资源相关的引用。

看起来eclipse项目已经编写了一个小的java应用程序来替换图标。

来自eclipse项目的IconExe

Netbeans中的app.exe和app64.exe似乎在资源部分中有以下图标:
48 x 48 32位
32 x 31 32位
48 x 48 8bit
31 x 31 8位
16 x 16 8bit

我猜32 x 31是个错误

您只需要替换可执行文件资源部分中的第一个ICO或BMP。 浏览器会自动选择该图标作为要显示的图标。