登录
首页 >  Golang >  Go问答

使用 -ldflags -H=windowsgui 编译 golang 应用程序时将输出打印到命令窗口

来源:Golang技术栈

时间:2023-03-28 08:13:26 296浏览 收藏

golang学习网今天将给大家带来《使用 -ldflags -H=windowsgui 编译 golang 应用程序时将输出打印到命令窗口》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到golang等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!

问题内容

我有一个通常在后台静默运行的应用程序,所以我编译它

go build -ldflags -H=windowsgui 

要在命令行检查版本,我想将 -V 标志传递给命令行,以获取包含要打印到命令提示符的版本的字符串,然后让应用程序退出。我添加了标志包和代码。当我用

go run  -V

...它可以很好地打印版本。当我编译 exe 时,它​​只是退出,什么也不打印。我怀疑这是编译标志导致它无法访问控制台并将我的文本发送到位桶。

我尝试使用 println 和 fprintf 和 os.stderr.write 打印到 stderr 和 stdout 的变体,但编译的应用程序中没有出现任何内容。使用这些标志编译时,我应该如何尝试将字符串打印到命令提示符?

正确答案

问题是,当使用一个可执行文件创建进程时,它的PE 标头中[的“子系统”变量](http://msdn.microsoft.com/en- us/library/fcc1zstk)设置为“Windows”,该进程的[三个标准句柄](http://msdn.microsoft.com/en- us/library/windows/desktop/ms683231)关闭,并且 它不与任何控制台相关联 ——无论是否您是否从控制台运行它。(事实上​​,如果您运行一个可执行文件,其子系统设置为“控制台” 而不是 从控制台,则会为该进程强制创建一个控制台,并将该进程附加到它——您通常将其视为弹出的控制台窗口突然间。)[](http://msdn.microsoft.com/en- us/library/windows/desktop/ms683231) __ __

因此,要将任何内容从 Windows 上的 GUI 进程打印到控制台,您必须将该进程显式连接到附加到其父进程(如果有的话)的控制台,例如此处所述。为此,您调用[AttachConsole](http://msdn.microsoft.com/en- us/library/windows/desktop/ms681952)API 函数。使用 Go,这可以使用syscall包来完成:

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")
    }
}

为了真正完整,当AttachConsole()失败时,这段代码可能应该采用以下两种途径之一:

  • 调用AllocConsole()为它创建自己的控制台窗口。

据说这对于显示版本信息几乎没有用,因为该过程通常在打印后退出,由此产生的用户体验将是一个控制台窗口弹出并立即消失;高级用户会得到提示,他们应该从控制台重新运行应用程序,但普通人可能无法应对。

  • 发布一个显示相同信息的 GUI 对话框。

我认为这正是所需要的:请注意,显示帮助/使用消息以响应用户指定一些命令行参数通常在 心理上 与控制台相关联,但这不是要遵循的教条:例如,尝试msiexec.exe /?运行控制台,看看会发生什么。

以上就是《使用 -ldflags -H=windowsgui 编译 golang 应用程序时将输出打印到命令窗口》的详细内容,更多关于golang的资料请关注golang学习网公众号!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表