带有 Windows GUI 标志的静默 Go 应用程序和命令行输出
在 Go 应用程序中,使用 -ldflags -H=windowsgui 进行编译会禁用控制台访问,防止输出打印到命令窗口。要解决此问题并将版本信息打印到命令提示符,可以采取以下步骤:
根本问题是可执行文件的 PE 头包含“Windows”子系统变量,该变量使进程与任何控制台解除关联。要打印到命令提示符,需要显式控制台附件。
Go 的 syscall 包提供了 AttachConsole 函数来实现此目的。下面的代码演示了它的用法:
package main import ( "fmt" "syscall" ) const ( ATTACH_PARENT_PROCESS = ^uint32(0) // (DWORD)-1 ) var ( modkernel32 = syscall.NewLazyDLL("kernel32.dll") procAttachConsole = modkernel32.NewProc("AttachConsole") ) func AttachConsole(dwParentProcess uint32) (ok bool) { r0, _, _ := syscall.Syscall(procAttachConsole.Addr(), 1, uintptr(dwParentProcess), 0, 0) ok = bool(r0 != 0) return } func main() { ok := AttachConsole(ATTACH_PARENT_PROCESS) if ok { fmt.Println("Okay, attached") } }
附加到父进程的控制台后,程序可以像往常一样使用 fmt.Println 打印到命令提示符。
此外,对于一个完整的解决方案,考虑通过使用 AllocConsole() 创建新的控制台窗口或显示 GUI 对话框来通知用户该问题来处理故障场景。
以上是如何从使用 `-ldflags -H=windowsgui` 编译的 Silent Go 应用程序打印命令行输出?的详细内容。更多信息请关注PHP中文网其他相关文章!