查看: 123|回复: 1

使用go-winres为Go编译的Windows exe添加图标和属性信息

[复制链接]
发表于 3 小时前 | 显示全部楼层 |阅读模式
在使用Go语言开发Windows应用程序时,编译得到的exe文件天然不依赖动态链接库和运行环境,但默认也不含图标、文件版本、公司名称等属性信息。对于需要分发给用户的桌面工具或系统服务,带上正确的图标和元数据不仅能提升专业度,还能避免被误识别为可疑文件。本文介绍如何通过go-winres这一命令行工具,为Go构建的exe添加自定义图标和标准资源信息。

安装go-winres
首先确保已安装Go开发环境。在终端执行以下命令即可将go-winres安装到系统PATH中:
  1. go install github.com/tc-hib/go-winres@latest
复制代码
安装完成后,在命令行中直接使用go-winres命令。

初始化配置模板
在Go项目的根目录下执行:
  1. go-winres init
复制代码
该命令会在当前目录生成一个winres文件夹,其中包含winres.json配置文件以及两个示例PNG图标文件(icon.png和icon16.png)。winres.json是核心配置,用于定义图标、应用程序清单和版本元数据。

配置图标
使用文本编辑器打开winres.json。找到RT_GROUP_ICON节点,其结构如下:
  1. "RT_GROUP_ICON": {
  2. "APP": {
  3. "0000": [
  4. "icon.png",
  5. "icon16.png"
  6. ]
  7. }
  8. }
复制代码
APP代表图标组名称,0000代表语言(通常无需修改)。数组内列出需要嵌入的图标文件,支持多个分辨率,最终exe会根据系统需要自动选择合适的尺寸。
将自定义的图标文件(PNG格式,尺寸不超过256x256)放入winres文件夹,然后修改配置,例如只保留一个图标文件:
  1. "RT_GROUP_ICON": {
  2. "APP": {
  3. "0000": [
  4. "my-icon.png"
  5. ]
  6. }
  7. }
复制代码
注意:图标文件必须与winres.json位于同一目录(即winres文件夹内)。

配置应用程序清单
RT_MANIFEST节点用于声明程序所需的最低操作系统版本、执行权限、DPI感知等属性。示例如下:
  1. "RT_MANIFEST": {
  2. "#1": {
  3. "2052": {
  4. "description": "我的Go示例程序",
  5. "minimum-os": "win7",
  6. "execution-level": "highest",
  7. "dpi-awareness": "system",
  8. "ui-access": false,
  9. "auto-elevate": false,
  10. "disable-theming": false,
  11. "disable-window-filtering": false,
  12. "high-resolution-scrolling-aware": false,
  13. "ultra-high-resolution-scrolling-aware": false,
  14. "long-path-aware": false,
  15. "printer-driver-isolation": false,
  16. "gdi-scaling": false,
  17. "segment-heap": false,
  18. "use-common-controls-v6": false
  19. }
  20. }
  21. }
复制代码
常用字段说明:
- description:文件描述信息。
- minimum-os:最低操作系统版本,可选值包括"vista"、"win7"、"win8"、"win8.1"、"win10"。
- execution-level:请求的权限级别,可选"as invoker"(无特殊权限)、"highest"(当前用户可用最高权限)、"administrator"(强制以管理员身份运行)。
- dpi-awareness:DPI感知级别,建议设为"system"或"per-monitor"。
注意:identity字段(名称和版本)对于普通应用程序可以留空或删除。

配置版本元数据
RT_VERSION节点用于设置文件版本、产品版本、公司名称、版权等属性。结构如下:
  1. "RT_VERSION": {
  2. "#1": {
  3. "0000": {
  4. "fixed": {
  5. "file_version": "1.0.0.0"
  6. },
  7. "info": {
  8. "2052": {
  9. "CompanyName": "公司名称",
  10. "FileDescription": "我的Golang示例程序",
  11. "LegalCopyright": "© 版权",
  12. "OriginalFilename": "demo.exe",
  13. "ProductName": "Go示例",
  14. "ProductVersion": "1.0.0.0"
  15. }
  16. }
  17. }
  18. }
  19. }
复制代码
- fixed.file_version / product_version:按x.y.z.w格式填写。
- info内以语言代码为键(如0409为英语,2052为简体中文),可配置多语言,Windows会按系统语言显示对应信息。
为简化配置,原文提供了一个精简的模板,读者可根据自身需求修改。

编译资源文件
在winres文件夹所在目录(即项目根目录)下执行:
  1. go-winres make
复制代码
该命令会读取winres/winres.json,生成两个syso文件(例如resource_windows_amd64.syso和resource_windows_386.syso)。这些syso文件即为编译后的资源对象,后续go build会自动链接。
如果配置文件不在默认位置,可通过--in参数指定:
  1. go-winres make --in "../res/winres.json"
复制代码
使用--out可指定输出路径。

编译Go程序
确保资源文件(syso)、go.mod以及Go源代码处于同一目录下。然后正常执行go build命令:
  1. go build -ldflags "-w -s"
复制代码
其中-ldflags "-w -s"为可选参数,用于去除调试信息和符号表以减少exe体积。生成的可执行文件将包含先前配置的图标、版本信息、描述等属性。

注意事项
- syso文件的后缀名必须保留类似_windows_amd64.syso的形式,不能随意更改,否则go build无法根据目标架构自动匹配。
- 编译时请注意目标架构:go build默认使用当前系统架构,如需交叉编译32位exe,需设置环境变量GOARCH=386,go build会自动选择对应的_windows_386.syso文件。
- 如果项目中已存在go.mod,syso文件必须与go.mod同级;如果没有go.mod,则需与主入口文件(如main.go)同级。
通过以上步骤,任何用Go编写的Windows命令行工具或后台服务都能拥有标准的Windows资源信息,从而更好地融入Windows生态。
回复

使用道具 举报

发表于 3 小时前 | 显示全部楼层

Re: 使用go-winres为Go编译的Windows exe添加图标和属性信息

感谢分享!正好最近在给一个Go写的命令行小工具打包,默认没有图标看着确实有点简陋。教程很清晰,特别是清单和版本信息的配置部分,之前一直搞不清DPI感知怎么设,这下明白了。想请教一下,如果图标文件不是PNG而是ICO格式,go-winres是否支持直接使用?还是需要先转成PNG?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-5 22:23 , Processed in 0.024018 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部