Fixed issues handling INVALID_HANDLE_VALUE in the Windows constant generator, and built the first build with generated constants!

This commit is contained in:
Pietro Gagliardi 2014-05-25 14:04:03 -04:00
parent d2746b7d2c
commit 1f94a68432
3 changed files with 121 additions and 2 deletions

View File

@ -59,7 +59,8 @@ func forceCommonControls6() (err error) {
actctx.lpSource = syscall.StringToUTF16Ptr(filename) actctx.lpSource = syscall.StringToUTF16Ptr(filename)
r1, _, err := _createActCtx.Call(uintptr(unsafe.Pointer(&actctx))) r1, _, err := _createActCtx.Call(uintptr(unsafe.Pointer(&actctx)))
if r1 == negConst(_INVALID_HANDLE_VALUE) { // failure // don't negConst() INVALID_HANDLE_VALUE; windowsconstgen was given a pointer by windows.h, and pointers are unsigned, so converting it back to signed doesn't work
if r1 == _INVALID_HANDLE_VALUE { // failure
return fmt.Errorf("error creating activation context for synthesized manifest file: %v", err) return fmt.Errorf("error creating activation context for synthesized manifest file: %v", err)
} }
r1, _, err = _activateActCtx.Call( r1, _, err = _activateActCtx.Call(

View File

@ -72,6 +72,31 @@ func gatherNames(pkg *ast.Package) {
} }
} }
// some constants confuse cgo into thinking they're external symbols for some reason
// TODO debug cgo
var hacknames = map[string]string{
"_INVALID_HANDLE_VALUE": "x_INVALID_HANDLE_VALUE",
}
func hacknamesPreamble() string {
if len(hacknames) == 0 {
return ""
}
// keep sorted for git
hn := make([]string, 0, len(hacknames))
for origname, _ := range hacknames {
hn = append(hn, origname)
}
sort.Strings(hn)
s := "// /* because cgo has issues with these */\n"
s += "// #include <stdint.h>\n"
for _, origname := range hn {
s += "// uintptr_t " + hacknames[origname] + " = (uintptr_t) (" +
origname[1:] + ");\n" // strip leading _
}
return s
}
func preamble(pkg string) string { func preamble(pkg string) string {
return "// autogenerated by windowsconstgen; do not edit\n" + return "// autogenerated by windowsconstgen; do not edit\n" +
"package " + pkg + "\n" "package " + pkg + "\n"
@ -104,6 +129,10 @@ func main() {
// keep sorted for git // keep sorted for git
consts := make([]string, 0, len(unknown)) consts := make([]string, 0, len(unknown))
for ident, _ := range unknown { for ident, _ := range unknown {
if hackname, ok := hacknames[ident]; ok {
consts = append(consts, hackname)
continue
}
consts = append(consts, ident) consts = append(consts, ident)
} }
sort.Strings(consts) sort.Strings(consts)
@ -122,11 +151,18 @@ func main() {
"import \"fmt\"\n" + "import \"fmt\"\n" +
"// #include <windows.h>\n" + "// #include <windows.h>\n" +
"// #include <commctrl.h>\n" + "// #include <commctrl.h>\n" +
"%s" +
"import \"C\"\n" + "import \"C\"\n" +
"func main() {\n" + "func main() {\n" +
" fmt.Println(%q)\n", " fmt.Println(%q)\n",
preamble("main"), preamble("ui")) preamble("main"), hacknamesPreamble(), preamble("ui"))
for _, ident := range consts { for _, ident := range consts {
if ident[0] == 'x' {
// hack name; strip the leading x (but not the _ after it) from the constant name but keep the value name unchanged
fmt.Fprintf(f, " fmt.Println(\"const %s =\", C.%s)\n", ident[1:], ident)
continue
}
// not a hack name; strip the leading _ from the value name but keep the constant name unchanged
fmt.Fprintf(f, " fmt.Println(\"const %s =\", C.%s)\n", ident, ident[1:]) fmt.Fprintf(f, " fmt.Println(\"const %s =\", C.%s)\n", ident, ident[1:])
} }
fmt.Fprintf(f, "}\n") fmt.Fprintf(f, "}\n")

82
zconstants_windows_386.go Normal file
View File

@ -0,0 +1,82 @@
// autogenerated by windowsconstgen; do not edit
package ui
const _BCM_GETIDEALSIZE = 5633
const _BM_GETCHECK = 240
const _BN_CLICKED = 0
const _BST_CHECKED = 1
const _BS_AUTOCHECKBOX = 3
const _BS_PUSHBUTTON = 0
const _CBS_AUTOHSCROLL = 64
const _CBS_DROPDOWN = 2
const _CBS_DROPDOWNLIST = 3
const _CB_ADDSTRING = 323
const _CB_DELETESTRING = 324
const _CB_ERR = -1
const _CB_ERRSPACE = -2
const _CB_GETCOUNT = 326
const _CB_GETCURSEL = 327
const _CB_INSERTSTRING = 330
const _COLOR_BTNFACE = 15
const _CW_USEDEFAULT = -2147483648
const _ERROR = 0
const _ES_AUTOHSCROLL = 128
const _ES_PASSWORD = 32
const _GWL_STYLE = -16
const _ICC_PROGRESS_CLASS = 32
const _LBS_EXTENDEDSEL = 2048
const _LBS_NOINTEGRALHEIGHT = 256
const _LBS_NOTIFY = 1
const _LB_ADDSTRING = 384
const _LB_DELETESTRING = 386
const _LB_ERR = -1
const _LB_ERRSPACE = -2
const _LB_GETCOUNT = 395
const _LB_GETCURSEL = 392
const _LB_GETSELCOUNT = 400
const _LB_GETSELITEMS = 401
const _LB_GETTEXT = 393
const _LB_GETTEXTLEN = 394
const _LB_INSERTSTRING = 385
const _PBM_SETMARQUEE = 1034
const _PBM_SETPOS = 1026
const _PBS_MARQUEE = 8
const _PBS_SMOOTH = 1
const _SB_HORZ = 0
const _SB_LEFT = 6
const _SB_LINELEFT = 0
const _SB_LINERIGHT = 1
const _SB_PAGELEFT = 2
const _SB_PAGERIGHT = 3
const _SB_RIGHT = 7
const _SB_THUMBPOSITION = 4
const _SB_THUMBTRACK = 5
const _SB_VERT = 1
const _SIF_PAGE = 2
const _SIF_POS = 4
const _SIF_RANGE = 1
const _SIF_TRACKPOS = 16
const _SS_LEFTNOWORDWRAP = 12
const _SS_NOPREFIX = 128
const _SW_ERASE = 4
const _SW_HIDE = 0
const _SW_INVALIDATE = 2
const _SW_SHOW = 5
const _SW_SHOWDEFAULT = 10
const _WM_CLOSE = 16
const _WM_ERASEBKGND = 20
const _WM_GETMINMAXINFO = 36
const _WM_GETTEXT = 13
const _WM_GETTEXTLENGTH = 14
const _WM_HSCROLL = 276
const _WM_SETFONT = 48
const _WM_SIZE = 5
const _WM_VSCROLL = 277
const _WS_CHILD = 1073741824
const _WS_EX_CLIENTEDGE = 512
const _WS_HSCROLL = 1048576
const _WS_OVERLAPPEDWINDOW = 13565952
const _WS_TABSTOP = 65536
const _WS_VISIBLE = 268435456
const _WS_VSCROLL = 2097152
const _INVALID_HANDLE_VALUE = 4294967295