码上焚香

Yahocen

去除 GraalVM 打包后的 Windows 本地程序控制台(editbin)

14
2024-09-12

默认情况下,GraalVM 打包后的 exe 文件子系统类型为 CONSOLE。目前,GraalVM 尚未提供相关设置选项。然而,您可以通过以下方法在 Windows 系统上更改子系统类型。您可以使用 Windows SDK 附带的工具中的 editbin 来实现这一目的。通过简单的命令,您可以将打包后的 exe 文件的子系统类型设置为 WINDOWS。这样,再次运行程序时,就不会再出现命令行黑框,而程序会在后台作为任务继续执行。更多关于 editbin 工具的信息,请参考Windows SDK 附带的工具

editbin /SUBSYSTEM:WINDOWS my.exe

子系统类型

子系统类型决定了程序如何与操作系统交互。不同的子系统类型对应不同的运行环境。常见的子系统类型包括:

  • CONSOLE:表示程序将在控制台环境下运行。

  • WINDOWS:表示程序将作为一个图形界面应用程序运行,并且需要一个窗口消息循环。

  • NATIVE:表示程序是针对特定的硬件或驱动程序的。

  • WINDOWSCE:表示程序是为 Windows CE 设计的。

  • POSIX:表示程序将使用 POSIX 环境。

editbin 工具介绍

editbin.exe 是一个命令行工具,属于 Microsoft 的开发工具集的一部分,通常用于修改编译后生成的可执行文件或 DLL 文件的属性。它可以用来更改 PE(Portable Executable)文件的多个属性,包括但不限于子系统类型、版本信息、调试信息等。

主要功能

  1. 修改子系统类型

    • 通过 /SUBSYSTEM: 选项,可以指定不同的子系统类型,如 CONSOLE, WINDOWS, NATIVE, WINDOWSCE, POSIX 等。

  2. 设置调试信息

    • 通过 /DEBUG 选项,可以控制可执行文件中包含的调试信息。

    • 例如,/DEBUG 可以用来启用调试信息,而 /DEBUG:NONE 可以移除调试信息。

  3. 设置链接器选项

    • 通过 /LARGEADDRESSAWARE 选项,可以使程序能够使用大于 2GB 的地址空间(在 32 位系统上)。

    • 例如,/LARGEADDRESSAWARE 可以使程序能够在大地址空间下运行。

  4. 设置 DLL 导入库

    • 通过 /IMPLIB: 选项,可以指定 DLL 的导入库文件名。

    • 例如,/IMPLIB:mylib.lib 可以为 DLL 文件指定一个导入库文件名。

  5. 设置延迟加载 DLL

    • 通过 /DELAYLOAD: 选项,可以指定延迟加载的 DLL 名称。

    • 例如,/DELAYLOAD:kernel32.dll 可以使程序在需要时才加载指定的 DLL。

  6. 设置程序的优先级

    • 通过 /PRIORITY: 选项,可以设置程序的优先级。

    • 例如,/PRIORITY:HIGH 可以将程序的优先级设置为高优先级。

  7. 设置程序的堆栈大小

    • 通过 /STACK:reserve,commit 选项,可以设置程序的初始堆栈大小和最大堆栈大小。

    • 例如,/STACK:1024k,1024k 可以设置初始和最大堆栈大小均为 1024KB。

  8. 设置程序的入口点

    • 通过 /ENTRY: 选项,可以指定程序的入口点。

    • 例如,/ENTRY:mainCRTStartup 可以设置程序的入口点为 mainCRTStartup 函数。

示例命令

以下是一些示例命令,展示 editbin 的不同功能:

设置程序为大地址空间感知

editbin /LARGEADDRESSAWARE my.exe

设置程序优先级为高

editbin /PRIORITY:HIGHEST my.exe

设置程序堆栈大小

editbin /STACK:1024k,1024k my.exe

设置程序入口点

editbin /ENTRY:mainCRTStartup my.exe