ホームページ >バックエンド開発 >Golang >`-ldflags -H=windowsgui` でコンパイルされた Go GUI アプリケーションからコマンド ウィンドウに出力するにはどうすればよいですか?

`-ldflags -H=windowsgui` でコンパイルされた Go GUI アプリケーションからコマンド ウィンドウに出力するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-03 20:25:12730ブラウズ

How to Print to the Command Window from a Go GUI Application Compiled with `-ldflags -H=windowsgui`?

-ldflags でコンパイルされた GUI アプリケーションの出力をコマンド ウィンドウに出力する方法 -H=windowsgui

-ldflags で Go アプリケーションをコンパイルする -グラフィカル ユーザー インターフェイス (GUI) として使用される H=windowsgui は、コマンド ウィンドウへの出力の印刷に問題が生じる可能性があります。これは、Windows 上の GUI プロセスが通常、コンソールに関連付けられていないためです。

問題

アプリケーションが -H=windowsgui フラグを使用してコンパイルされると、印刷しようとしますprintln や fmt.Println などの標準メソッドを使用して出力すると、コマンドには何も表示されませんwindow.

解決策

このシナリオで出力を印刷するには、プロセスを親プロセスのコンソールに明示的にアタッチする必要があります。これは、syscall パッケージからアクセスできる AttachConsole API 関数を使用して実現できます。

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(ATTACH_PARENT_PROCESS) を呼び出し、プロセスを親コンソールに接続します。この手順の後は、通常どおり標準の印刷方法を使用できます。

追加オプション

AttachConsole が失敗した場合は、次の代替手段を検討できます:

  • AllocConsole(): を使用してコンソール ウィンドウを作成します。これにより、次の新しいコンソール ウィンドウが作成されます。
  • GUI ダイアログを使用します: グラフィカル ユーザー インターフェイス ダイアログ ボックスに情報を表示します。これにより、情報がわかりやすくなります。ユーザーエクスペリエンスを向上させ、情報をより自然に GUI アプリケーションに関連付けます。

以上が`-ldflags -H=windowsgui` でコンパイルされた Go GUI アプリケーションからコマンド ウィンドウに出力するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。