blob: bea6516273b3c26b146ccf1f1eeec4f633c54f29 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
// 8 february 2014
package main
import (
"fmt"
// "syscall"
"unsafe"
)
const (
windowclass = "gouiwndclass"
)
var (
hInstance HANDLE
nCmdShow int
// TODO font
// TODO common window class
)
// TODO is this trick documented in MSDN?
func getWinMainhInstance() (err error) {
r1, _, err := kernel32.NewProc("GetModuleHandleW").Call(uintptr(NULL))
if r1 == 0 { // failure
return err
}
hInstance = HANDLE(r1)
return nil
}
// TODO this is what MinGW-w64's crt (svn revision xxx) does; is it best? is any of this documented anywhere on MSDN?
// TODO I highly doubt Windows API functions ever not fail, so figure out what to do should an error actually occur
func getWinMainnCmdShow() (nCmdShow int, err error) {
var info struct {
cb uint32
lpReserved *uint16
lpDesktop *uint16
lpTitle *uint16
dwX uint32
dwY uint32
dwXSize uint32
dwYSzie uint32
dwXCountChars uint32
dwYCountChars uint32
dwFillAttribute uint32
dwFlags uint32
wShowWindow uint16
cbReserved2 uint16
lpReserved2 *byte
hStdInput HANDLE
hStdOutput HANDLE
hStdError HANDLE
}
const _STARTF_USESHOWWINDOW = 0x00000001
// does not fail according to MSDN
kernel32.NewProc("GetStartupInfoW").Call(uintptr(unsafe.Pointer(&info)))
if info.dwFlags & _STARTF_USESHOWWINDOW != 0 {
nCmdShow = int(info.wShowWindow)
return nil
}
nCmdShow = _SW_SHOWDEFAULT
return nil
}
func doWindowsInit() (err error) {
err = getWinMainhInstance()
if err != nil {
return fmt.Errorf("error getting WinMain hInstance: %v", err)
}
err = getWinMainnCmdShow()
if err != nil {
return fmt.Errorf("error getting WinMain nCmdShow: %v", err)
}
// TODO others
return nil // all ready to go
}
|