go-tg-screenshot-bot
463 строки · 11.3 Кб
1// Copyright 2010 The win Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// +build windows
6
7package win8
9import (10"fmt"11"golang.org/x/sys/windows"12"syscall"13"unsafe"14)
15
16type DISPID int3217
18const (19DISPID_BEFORENAVIGATE DISPID = 10020DISPID_NAVIGATECOMPLETE DISPID = 10121DISPID_STATUSTEXTCHANGE DISPID = 10222DISPID_QUIT DISPID = 10323DISPID_DOWNLOADCOMPLETE DISPID = 10424DISPID_COMMANDSTATECHANGE DISPID = 10525DISPID_DOWNLOADBEGIN DISPID = 10626DISPID_NEWWINDOW DISPID = 10727DISPID_PROGRESSCHANGE DISPID = 10828DISPID_WINDOWMOVE DISPID = 10929DISPID_WINDOWRESIZE DISPID = 11030DISPID_WINDOWACTIVATE DISPID = 11131DISPID_PROPERTYCHANGE DISPID = 11232DISPID_TITLECHANGE DISPID = 11333DISPID_TITLEICONCHANGE DISPID = 11434DISPID_FRAMEBEFORENAVIGATE DISPID = 20035DISPID_FRAMENAVIGATECOMPLETE DISPID = 20136DISPID_FRAMENEWWINDOW DISPID = 20437DISPID_BEFORENAVIGATE2 DISPID = 25038DISPID_NEWWINDOW2 DISPID = 25139DISPID_NAVIGATECOMPLETE2 DISPID = 25240DISPID_ONQUIT DISPID = 25341DISPID_ONVISIBLE DISPID = 25442DISPID_ONTOOLBAR DISPID = 25543DISPID_ONMENUBAR DISPID = 25644DISPID_ONSTATUSBAR DISPID = 25745DISPID_ONFULLSCREEN DISPID = 25846DISPID_DOCUMENTCOMPLETE DISPID = 25947DISPID_ONTHEATERMODE DISPID = 26048DISPID_ONADDRESSBAR DISPID = 26149DISPID_WINDOWSETRESIZABLE DISPID = 26250DISPID_WINDOWCLOSING DISPID = 26351DISPID_WINDOWSETLEFT DISPID = 26452DISPID_WINDOWSETTOP DISPID = 26553DISPID_WINDOWSETWIDTH DISPID = 26654DISPID_WINDOWSETHEIGHT DISPID = 26755DISPID_CLIENTTOHOSTWINDOW DISPID = 26856DISPID_SETSECURELOCKICON DISPID = 26957DISPID_FILEDOWNLOAD DISPID = 27058DISPID_NAVIGATEERROR DISPID = 27159DISPID_PRIVACYIMPACTEDSTATECHANGE DISPID = 27260DISPID_NEWWINDOW3 DISPID = 27361)
62
63var (64IID_IDispatch = IID{0x00020400, 0x0000, 0x0000, [8]byte{0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}65)
66
67const (68DISP_E_MEMBERNOTFOUND = 0x8002000369)
70
71const (72CSC_UPDATECOMMANDS = ^0x073CSC_NAVIGATEFORWARD = 0x174CSC_NAVIGATEBACK = 0x275)
76
77type IDispatchVtbl struct {78QueryInterface uintptr79AddRef uintptr80Release uintptr81GetTypeInfoCount uintptr82GetTypeInfo uintptr83GetIDsOfNames uintptr84Invoke uintptr85}
86
87type IDispatch struct {88LpVtbl *IDispatchVtbl89}
90
91type VARTYPE uint1692
93const (94VT_EMPTY VARTYPE = 095VT_NULL VARTYPE = 196VT_I2 VARTYPE = 297VT_I4 VARTYPE = 398VT_R4 VARTYPE = 499VT_R8 VARTYPE = 5100VT_CY VARTYPE = 6101VT_DATE VARTYPE = 7102VT_BSTR VARTYPE = 8103VT_DISPATCH VARTYPE = 9104VT_ERROR VARTYPE = 10105VT_BOOL VARTYPE = 11106VT_VARIANT VARTYPE = 12107VT_UNKNOWN VARTYPE = 13108VT_DECIMAL VARTYPE = 14109VT_I1 VARTYPE = 16110VT_UI1 VARTYPE = 17111VT_UI2 VARTYPE = 18112VT_UI4 VARTYPE = 19113VT_I8 VARTYPE = 20114VT_UI8 VARTYPE = 21115VT_INT VARTYPE = 22116VT_UINT VARTYPE = 23117VT_VOID VARTYPE = 24118VT_HRESULT VARTYPE = 25119VT_PTR VARTYPE = 26120VT_SAFEARRAY VARTYPE = 27121VT_CARRAY VARTYPE = 28122VT_USERDEFINED VARTYPE = 29123VT_LPSTR VARTYPE = 30124VT_LPWSTR VARTYPE = 31125VT_RECORD VARTYPE = 36126VT_INT_PTR VARTYPE = 37127VT_UINT_PTR VARTYPE = 38128VT_FILETIME VARTYPE = 64129VT_BLOB VARTYPE = 65130VT_STREAM VARTYPE = 66131VT_STORAGE VARTYPE = 67132VT_STREAMED_OBJECT VARTYPE = 68133VT_STORED_OBJECT VARTYPE = 69134VT_BLOB_OBJECT VARTYPE = 70135VT_CF VARTYPE = 71136VT_CLSID VARTYPE = 72137VT_VERSIONED_STREAM VARTYPE = 73138VT_BSTR_BLOB VARTYPE = 0xfff139VT_VECTOR VARTYPE = 0x1000140VT_ARRAY VARTYPE = 0x2000141VT_BYREF VARTYPE = 0x4000142VT_RESERVED VARTYPE = 0x8000143VT_ILLEGAL VARTYPE = 0xffff144VT_ILLEGALMASKED VARTYPE = 0xfff145VT_TYPEMASK VARTYPE = 0xfff146)
147
148type VARIANTARG struct {149VARIANT
150}
151
152type VARIANT_BOOL int16153
154const (155VARIANT_TRUE VARIANT_BOOL = -1156VARIANT_FALSE VARIANT_BOOL = 0157)
158
159type SAFEARRAYBOUND struct {160CElements uint32161LLbound int32162}
163
164type SAFEARRAY struct {165CDims uint16166FFeatures uint16167CbElements uint32168CLocks uint32169PvData uintptr170Rgsabound [1]SAFEARRAYBOUND171}
172
173//type BSTR *uint16
174
175func StringToBSTR(value string) *uint16 /*BSTR*/ {176// IMPORTANT: Don't forget to free the BSTR value when no longer needed!177return SysAllocString(value)178}
179
180func BSTRToString(value *uint16 /*BSTR*/) string {181// ISSUE: Is this really ok?182bstrArrPtr := (*[200000000]uint16)(unsafe.Pointer(value))183
184bstrSlice := make([]uint16, SysStringLen(value))185copy(bstrSlice, bstrArrPtr[:])186
187return syscall.UTF16ToString(bstrSlice)188}
189
190func IntToVariantI4(value int32) *VAR_I4 {191return &VAR_I4{vt: VT_I4, lVal: value}192}
193
194func VariantI4ToInt(value *VAR_I4) int32 {195return value.lVal196}
197
198func BoolToVariantBool(value bool) *VAR_BOOL {199return &VAR_BOOL{vt: VT_BOOL, boolVal: VARIANT_BOOL(BoolToBOOL(value))}200}
201
202func VariantBoolToBool(value *VAR_BOOL) bool {203return value.boolVal != 0204}
205
206func StringToVariantBSTR(value string) *VAR_BSTR {207// IMPORTANT: Don't forget to free the BSTR value when no longer needed!208return &VAR_BSTR{vt: VT_BSTR, bstrVal: StringToBSTR(value)}209}
210
211func VariantBSTRToString(value *VAR_BSTR) string {212return BSTRToString(value.bstrVal)213}
214
215func (v *VARIANT) MustLong() int32 {216value, err := v.Long()217if err != nil {218panic(err)219}220return value221}
222
223func (v *VARIANT) Long() (int32, error) {224if v.Vt != VT_I4 {225return 0, fmt.Errorf("Error: Long() v.Vt != VT_I4, ptr=%p, value=%+v", v, v)226}227p := (*VAR_I4)(unsafe.Pointer(v))228return p.lVal, nil229}
230
231func (v *VARIANT) SetLong(value int32) {232v.Vt = VT_I4233p := (*VAR_I4)(unsafe.Pointer(v))234p.lVal = value235}
236
237func (v *VARIANT) MustULong() uint32 {238value, err := v.ULong()239if err != nil {240panic(err)241}242return value243}
244
245func (v *VARIANT) ULong() (uint32, error) {246if v.Vt != VT_UI4 {247return 0, fmt.Errorf("Error: ULong() v.Vt != VT_UI4, ptr=%p, value=%+v", v, v)248}249p := (*VAR_UI4)(unsafe.Pointer(v))250return p.ulVal, nil251}
252
253func (v *VARIANT) SetULong(value uint32) {254v.Vt = VT_UI4255p := (*VAR_UI4)(unsafe.Pointer(v))256p.ulVal = value257}
258
259func (v *VARIANT) MustBool() VARIANT_BOOL {260value, err := v.Bool()261if err != nil {262panic(err)263}264return value265}
266
267func (v *VARIANT) Bool() (VARIANT_BOOL, error) {268if v.Vt != VT_BOOL {269return VARIANT_FALSE, fmt.Errorf("Error: Bool() v.Vt != VT_BOOL, ptr=%p, value=%+v", v, v)270}271p := (*VAR_BOOL)(unsafe.Pointer(v))272return p.boolVal, nil273}
274
275func (v *VARIANT) SetBool(value VARIANT_BOOL) {276v.Vt = VT_BOOL277p := (*VAR_BOOL)(unsafe.Pointer(v))278p.boolVal = value279}
280
281func (v *VARIANT) MustBSTR() *uint16 {282value, err := v.BSTR()283if err != nil {284panic(err)285}286return value287}
288
289func (v *VARIANT) BSTR() (*uint16, error) {290if v.Vt != VT_BSTR {291return nil, fmt.Errorf("Error: BSTR() v.Vt != VT_BSTR, ptr=%p, value=%+v", v, v)292}293p := (*VAR_BSTR)(unsafe.Pointer(v))294return p.bstrVal, nil295}
296
297func (v *VARIANT) SetBSTR(value *uint16) {298v.Vt = VT_BSTR299p := (*VAR_BSTR)(unsafe.Pointer(v))300p.bstrVal = value301}
302
303func (v *VARIANT) MustPDispatch() *IDispatch {304value, err := v.PDispatch()305if err != nil {306panic(err)307}308return value309}
310
311func (v *VARIANT) PDispatch() (*IDispatch, error) {312if v.Vt != VT_DISPATCH {313return nil, fmt.Errorf("Error: PDispatch() v.Vt != VT_DISPATCH, ptr=%p, value=%+v", v, v)314}315p := (*VAR_PDISP)(unsafe.Pointer(v))316return p.pdispVal, nil317}
318
319func (v *VARIANT) SetPDispatch(value *IDispatch) {320v.Vt = VT_DISPATCH321p := (*VAR_PDISP)(unsafe.Pointer(v))322p.pdispVal = value323}
324
325func (v *VARIANT) MustPVariant() *VARIANT {326value, err := v.PVariant()327if err != nil {328panic(err)329}330return value331}
332
333func (v *VARIANT) PVariant() (*VARIANT, error) {334if v.Vt != VT_BYREF|VT_VARIANT {335return nil, fmt.Errorf("Error: PVariant() v.Vt != VT_BYREF|VT_VARIANT, ptr=%p, value=%+v", v, v)336}337p := (*VAR_PVAR)(unsafe.Pointer(v))338return p.pvarVal, nil339}
340
341func (v *VARIANT) SetPVariant(value *VARIANT) {342v.Vt = VT_BYREF | VT_VARIANT343p := (*VAR_PVAR)(unsafe.Pointer(v))344p.pvarVal = value345}
346
347func (v *VARIANT) MustPBool() *VARIANT_BOOL {348value, err := v.PBool()349if err != nil {350panic(err)351}352return value353}
354
355func (v *VARIANT) PBool() (*VARIANT_BOOL, error) {356if v.Vt != VT_BYREF|VT_BOOL {357return nil, fmt.Errorf("Error: PBool() v.Vt != VT_BYREF|VT_BOOL, ptr=%p, value=%+v", v, v)358}359p := (*VAR_PBOOL)(unsafe.Pointer(v))360return p.pboolVal, nil361}
362
363func (v *VARIANT) SetPBool(value *VARIANT_BOOL) {364v.Vt = VT_BYREF | VT_BOOL365p := (*VAR_PBOOL)(unsafe.Pointer(v))366p.pboolVal = value367}
368
369func (v *VARIANT) MustPPDispatch() **IDispatch {370value, err := v.PPDispatch()371if err != nil {372panic(err)373}374return value375}
376
377func (v *VARIANT) PPDispatch() (**IDispatch, error) {378if v.Vt != VT_BYREF|VT_DISPATCH {379return nil, fmt.Errorf("PPDispatch() v.Vt != VT_BYREF|VT_DISPATCH, ptr=%p, value=%+v", v, v)380}381p := (*VAR_PPDISP)(unsafe.Pointer(v))382return p.ppdispVal, nil383}
384
385func (v *VARIANT) SetPPDispatch(value **IDispatch) {386v.Vt = VT_BYREF | VT_DISPATCH387p := (*VAR_PPDISP)(unsafe.Pointer(v))388p.ppdispVal = value389}
390
391func (v *VARIANT) MustPSafeArray() *SAFEARRAY {392value, err := v.PSafeArray()393if err != nil {394panic(err)395}396return value397}
398
399func (v *VARIANT) PSafeArray() (*SAFEARRAY, error) {400if (v.Vt & VT_ARRAY) != VT_ARRAY {401return nil, fmt.Errorf("Error: PSafeArray() (v.Vt & VT_ARRAY) != VT_ARRAY, ptr=%p, value=%+v", v, v)402}403p := (*VAR_PSAFEARRAY)(unsafe.Pointer(v))404return p.parray, nil405}
406
407func (v *VARIANT) SetPSafeArray(value *SAFEARRAY, elementVt VARTYPE) {408v.Vt = VT_ARRAY | elementVt409p := (*VAR_PSAFEARRAY)(unsafe.Pointer(v))410p.parray = value411}
412
413type DISPPARAMS struct {414Rgvarg *VARIANTARG415RgdispidNamedArgs *DISPID416CArgs int32417CNamedArgs int32418}
419
420var (421// Library422liboleaut32 *windows.LazyDLL423
424// Functions425sysAllocString *windows.LazyProc426sysFreeString *windows.LazyProc427sysStringLen *windows.LazyProc428)
429
430func init() {431// Library432liboleaut32 = windows.NewLazySystemDLL("oleaut32.dll")433
434// Functions435sysAllocString = liboleaut32.NewProc("SysAllocString")436sysFreeString = liboleaut32.NewProc("SysFreeString")437sysStringLen = liboleaut32.NewProc("SysStringLen")438}
439
440func SysAllocString(s string) *uint16 /*BSTR*/ {441ret, _, _ := syscall.Syscall(sysAllocString.Addr(), 1,442uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(s))),4430,4440)445
446return (*uint16) /*BSTR*/ (unsafe.Pointer(ret))447}
448
449func SysFreeString(bstr *uint16 /*BSTR*/) {450syscall.Syscall(sysFreeString.Addr(), 1,451uintptr(unsafe.Pointer(bstr)),4520,4530)454}
455
456func SysStringLen(bstr *uint16 /*BSTR*/) uint32 {457ret, _, _ := syscall.Syscall(sysStringLen.Addr(), 1,458uintptr(unsafe.Pointer(bstr)),4590,4600)461
462return uint32(ret)463}
464