用Go语言编写能在Mac上运行的Windows应用程序「WALK」

如果需要在Mac上开发Windows程序,请使用此工具。虽然我不知道会有什么机会这样做,但事实上,我确实需要这样做,我认为在世界上这是可能的。

环境

ものバージョンmacOS10.14Golang1.11 darwin/amd64wine3.0.2

我认为只要随便安装Homebrew,Wine应该就能运行。

为什么选择golang?

因为在著名的Windows应用程序跨编译器MinGW中包含了g++,所以用C++编写代码是一种选择。或者说,最初我打算用C++来写。

然而,异步处理仍然很困难,因此我想使用goroutine来编写异步处理,因为我比较熟悉使用golang(相对于C++而言)。

此外,使用Golang处理字符串等操作的确更容易一些…… 如果在MinGW环境中使用Boost,或许处理字符串的操作可以变得更加轻松一些,但是由于我C++的能力有限,没有能够达到MinGW + Boost的水平,所以这次我选择放弃,使用Golang。

原文提供的内容太少了,无法提供详细的中文翻译。可以提供更多的内容或重新提供准确的原文吗?

我将使用WALK的Readme中提供的示例代码。

package main

import (
    "github.com/lxn/walk"
    . "github.com/lxn/walk/declarative"
    "strings"
)

func main() {
    var inTE, outTE *walk.TextEdit

    MainWindow{
        Title:   "SCREAMO",
        MinSize: Size{600, 400},
        Layout:  VBox{},
        Children: []Widget{
            HSplitter{
                Children: []Widget{
                    TextEdit{AssignTo: &inTE},
                    TextEdit{AssignTo: &outTE, ReadOnly: true},
                },
            },
            PushButton{
                Text: "SCREAM",
                OnClicked: func() {
                    outTE.SetText(strings.ToUpper(inTE.Text()))
                },
            },
        },
    }.Run()
}

构建

$ GOOS=windows GOARCH=386 go get -u github.com/lxn/walk
$ GOOS=windows GOARCH=386 go build main.go

用这个就可以生成 main.exe。

在去获取的时候,如果没有指定GOOS等参数,将无法成功执行WALK的get操作。

失败

$ wine main.exe

程序在没有任何显示的情况下结束运行。

修改

根据WALK的问题,看起来Tooltip相关的参数存在一个不能正常工作的错误,除非是特定的值。(可能是由wine引起的?)

在$GOPATH/github.com/lxn/walk/tooltip.go的第190行附近,将ti.CbSize的数值设定为42。

var ti win.TOOLINFO
ti.CbSize = 42   // <- ここ
ti.Hwnd = hwnd

如果尝试再次构建,这次窗口一定会显示出来。

$ GOOS=windows GOARCH=386 go build main.go
$ wine main.exe
スクリーンショット 2018-11-26 2.53.37.png

做得好!

顺便提一下,你也可以使用go-winio和其他Win32API库来继续这个进程。

如果只有Mac,也可以进行Windows应用开发啊!但如果接手Windows应用开发这个项目,我认为最好还是直接买一台Windows电脑比较方便。

bannerAds