用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

做得好!
顺便提一下,你也可以使用go-winio和其他Win32API库来继续这个进程。
如果只有Mac,也可以进行Windows应用开发啊!但如果接手Windows应用开发这个项目,我认为最好还是直接买一台Windows电脑比较方便。