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

Posted

技术标签:

【中文标题】从独立于开源平台的 Java 代码替换 Windows *.exe 中的图标【英文标题】:Replacing icon in Windows *.exe from open-source platform-independent Java code 【发布时间】:2012-01-29 08:46:06 【问题描述】:

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

要在没有manual steps 的情况下解决 NetBeans RFE #64612 我需要一个 Java (6+) 库,它可以采用 现有 Windows *.exe 文件并将其图标替换为通用格式的替代品.通用和预构建的可执行文件(以二进制形式分发)已经知道如何加载特定于应用程序的配置文件,然后使用各种应用程序 JAR 等启动 JRE;唯一的问题是它有一个通用图标,我想将该图标作为纯 Java 构建的一部分替换为特定于应用程序的图标,这样它看起来更漂亮。

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

<replaceicon from="app.exe" to="hello.exe" icon="hello.png"/>

有谁知道符合这些规范的工具是否已经存在?从各种网络搜索中我找到了Launch4J,但这似乎只是为了真正的工作而分叉windres,因此不是很容易移植。我发现JSmooth 看起来更有希望——似乎包含处理 ICO 编解码器和操作 PE 文件的 Java 代码——但它是 GPL。 WinRun4J 看起来使用本机代码进行图标操作,尽管我很难跟踪它的来源。 Jimi 应该处理 ICO 格式(就此而言,标准 javax.imageio 似乎也是如此)但我想没有更新 PE 资源的工具。

【问题讨论】:

相关问题:***.com/questions/1614772/how-to-change-jframe-icon 一个链接的问题指向java.net/projects/pe-file-reader,但这是 GPL 并且似乎只能读取而不是写入 PE 文件。 【参考方案1】:

这早就应该了,但我们刚刚发布了一个开源的 Maven 插件,可以做到这一点,因为我们遇到了同样的问题。

免责声明:我是这个项目的作者

相关文档可在以下位置获得:

https://zephyr.sunshower.io/site/

希望这对像我一样偶然发现此问题的人有所帮助。

【讨论】:

不是我的问题的答案,但很有趣。【参考方案2】:

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

IconExe from the eclipse project

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

我猜 32 x 31 是个错误

【讨论】:

可能是一个很好的起点,虽然它需要 ICO 输入,所以您首先必须以某种方式转换 PNG 输入。【参考方案3】:

PE/COFF 4J 项目似乎可以做你想做的事。它在Common Public License (CPL) 下获得许可。

一些注意事项:

作者好像和WinRunJ一样。这个项目实际上有一个 PE 资源编辑器,名为RCEDIT.exe,但正如您自己指出的那样,它使用本机 Windows 调用。为什么作者不使用他自己的项目(PE/COFF 4J)来完成这件事让我很震惊。这让我有些担心 PE/COFF 4J 项目可能被放弃了。

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

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

使用本机 Win32 调用时,替换 .EXE 文件中的图标资源相当简单。从纯 Java 执行此操作时,您必须确保在将 PE 文件写回磁盘时它是一致的。我没有深入研究 PE 文件格式,但我认为在替换/添加资源时许多引用会发生变化,而不仅仅是与您要替换/添加的资源相关的引用。

【讨论】:

谢谢。不再使用 NetBeans,但我在 NetBeans RFE 中提到了这个项目。 (不接受这个答案只是因为我还没有验证它是否真的适用于此目的。)【参考方案4】:

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

【讨论】:

对,替换可执行文件资源部分的图标是我想要完成的。但问题是,具体而言,如何从可能在另一个操作系统(可能在 CI 服务器上)运行的基于 Java 的构建中做到这一点。【参考方案5】:

根据我的 Eclipse 富客户端平台产品构建器,

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

您的分发包必须包含所有这些文件以独立于平台。

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

我确信在您交付分发包时可以自动更改 Windows 图标。我想这在其他平台上是可能的。

【讨论】:

有趣的背景信息,但不是我的问题的答案。

以上是关于从独立于开源平台的 Java 代码替换 Windows *.exe 中的图标的主要内容,如果未能解决你的问题,请参考以下文章

记录程序日志的三种选择

取代github ?CSDN发布开源代码托管平台 CODE.CHINA

盘点类似于GitHub的代码托管平台码云的度热门项目排行榜TOP 50

Java开源平台二次开发教程:开源数据网格的Excel导入导出功能

设计“独立于平台”的 GWT 服务器的最佳方式是啥?

如何在 C++ 中编写独立于平台的包装函数 [重复]