diff options
Diffstat (limited to 'winmain.go')
| -rw-r--r-- | winmain.go | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/winmain.go b/winmain.go new file mode 100644 index 0000000..b79ad81 --- /dev/null +++ b/winmain.go @@ -0,0 +1,59 @@ +// 8 february 2014 +package main + +import ( +// "syscall" + "unsafe" +) + +// this provides the hInstance and nCmdShow that are normally passed to WinMain() + +const ( + STARTF_USESHOWWINDOW = 0x00000001 +) + +var ( + getModuleHandle = kernel32.NewProc("GetModuleHandleW") + getStartupInfo = kernel32.NewProc("GetStartupInfoW") +) + +// TODO is this trick documented in MSDN? +func getWinMainhInstance() (hInstance HANDLE, err error) { + r1, _, err := getModuleHandle.Call(uintptr(NULL)) + if r1 == 0 { + return NULL, err + } + return HANDLE(r1), 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 + } + + // does not fail according to MSDN + getStartupInfo.Call(uintptr(unsafe.Pointer(&info))) + if info.dwFlags & STARTF_USESHOWWINDOW != 0 { + return int(info.wShowWindow), nil + } + return SW_SHOWDEFAULT, nil +} |
