package ole import ( "fmt" "strings" ) // DISPPARAMS are the arguments that passed to methods or property. type DISPPARAMS struct { rgvarg uintptr rgdispidNamedArgs uintptr cArgs uint32 cNamedArgs uint32 } // EXCEPINFO defines exception info. type EXCEPINFO struct { wCode uint16 wReserved uint16 bstrSource *uint16 bstrDescription *uint16 bstrHelpFile *uint16 dwHelpContext uint32 pvReserved uintptr pfnDeferredFillIn uintptr scode uint32 } // WCode return wCode in EXCEPINFO. func (e EXCEPINFO) WCode() uint16 { return e.wCode } // SCODE return scode in EXCEPINFO. func (e EXCEPINFO) SCODE() uint32 { return e.scode } // String convert EXCEPINFO to string. func (e EXCEPINFO) String() string { var src, desc, hlp string if e.bstrSource == nil { src = "" } else { src = BstrToString(e.bstrSource) } if e.bstrDescription == nil { desc = "" } else { desc = BstrToString(e.bstrDescription) } if e.bstrHelpFile == nil { hlp = "" } else { hlp = BstrToString(e.bstrHelpFile) } return fmt.Sprintf( "wCode: %#x, bstrSource: %v, bstrDescription: %v, bstrHelpFile: %v, dwHelpContext: %#x, scode: %#x", e.wCode, src, desc, hlp, e.dwHelpContext, e.scode, ) } // Error implements error interface and returns error string. func (e EXCEPINFO) Error() string { if e.bstrDescription != nil { return strings.TrimSpace(BstrToString(e.bstrDescription)) } src := "Unknown" if e.bstrSource != nil { src = BstrToString(e.bstrSource) } code := e.scode if e.wCode != 0 { code = uint32(e.wCode) } return fmt.Sprintf("%v: %#x", src, code) } // PARAMDATA defines parameter data type. type PARAMDATA struct { Name *int16 Vt uint16 } // METHODDATA defines method info. type METHODDATA struct { Name *uint16 Data *PARAMDATA Dispid int32 Meth uint32 CC int32 CArgs uint32 Flags uint16 VtReturn uint32 } // INTERFACEDATA defines interface info. type INTERFACEDATA struct { MethodData *METHODDATA CMembers uint32 } // Point is 2D vector type. type Point struct { X int32 Y int32 } // Msg is message between processes. type Msg struct { Hwnd uint32 Message uint32 Wparam int32 Lparam int32 Time uint32 Pt Point } // TYPEDESC defines data type. type TYPEDESC struct { Hreftype uint32 VT uint16 } // IDLDESC defines IDL info. type IDLDESC struct { DwReserved uint32 WIDLFlags uint16 } // TYPEATTR defines type info. type TYPEATTR struct { Guid GUID Lcid uint32 dwReserved uint32 MemidConstructor int32 MemidDestructor int32 LpstrSchema *uint16 CbSizeInstance uint32 Typekind int32 CFuncs uint16 CVars uint16 CImplTypes uint16 CbSizeVft uint16 CbAlignment uint16 WTypeFlags uint16 WMajorVerNum uint16 WMinorVerNum uint16 TdescAlias TYPEDESC IdldescType IDLDESC }