1
0

connect.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. package ole
  2. // Connection contains IUnknown for fluent interface interaction.
  3. //
  4. // Deprecated. Use oleutil package instead.
  5. type Connection struct {
  6. Object *IUnknown // Access COM
  7. }
  8. // Initialize COM.
  9. func (*Connection) Initialize() (err error) {
  10. return coInitialize()
  11. }
  12. // Uninitialize COM.
  13. func (*Connection) Uninitialize() {
  14. CoUninitialize()
  15. }
  16. // Create IUnknown object based first on ProgId and then from String.
  17. func (c *Connection) Create(progId string) (err error) {
  18. var clsid *GUID
  19. clsid, err = CLSIDFromProgID(progId)
  20. if err != nil {
  21. clsid, err = CLSIDFromString(progId)
  22. if err != nil {
  23. return
  24. }
  25. }
  26. unknown, err := CreateInstance(clsid, IID_IUnknown)
  27. if err != nil {
  28. return
  29. }
  30. c.Object = unknown
  31. return
  32. }
  33. // Release IUnknown object.
  34. func (c *Connection) Release() {
  35. c.Object.Release()
  36. }
  37. // Load COM object from list of programIDs or strings.
  38. func (c *Connection) Load(names ...string) (errors []error) {
  39. var tempErrors []error = make([]error, len(names))
  40. var numErrors int = 0
  41. for _, name := range names {
  42. err := c.Create(name)
  43. if err != nil {
  44. tempErrors = append(tempErrors, err)
  45. numErrors += 1
  46. continue
  47. }
  48. break
  49. }
  50. copy(errors, tempErrors[0:numErrors])
  51. return
  52. }
  53. // Dispatch returns Dispatch object.
  54. func (c *Connection) Dispatch() (object *Dispatch, err error) {
  55. dispatch, err := c.Object.QueryInterface(IID_IDispatch)
  56. if err != nil {
  57. return
  58. }
  59. object = &Dispatch{dispatch}
  60. return
  61. }
  62. // Dispatch stores IDispatch object.
  63. type Dispatch struct {
  64. Object *IDispatch // Dispatch object.
  65. }
  66. // Call method on IDispatch with parameters.
  67. func (d *Dispatch) Call(method string, params ...interface{}) (result *VARIANT, err error) {
  68. id, err := d.GetId(method)
  69. if err != nil {
  70. return
  71. }
  72. result, err = d.Invoke(id, DISPATCH_METHOD, params)
  73. return
  74. }
  75. // MustCall method on IDispatch with parameters.
  76. func (d *Dispatch) MustCall(method string, params ...interface{}) (result *VARIANT) {
  77. id, err := d.GetId(method)
  78. if err != nil {
  79. panic(err)
  80. }
  81. result, err = d.Invoke(id, DISPATCH_METHOD, params)
  82. if err != nil {
  83. panic(err)
  84. }
  85. return
  86. }
  87. // Get property on IDispatch with parameters.
  88. func (d *Dispatch) Get(name string, params ...interface{}) (result *VARIANT, err error) {
  89. id, err := d.GetId(name)
  90. if err != nil {
  91. return
  92. }
  93. result, err = d.Invoke(id, DISPATCH_PROPERTYGET, params)
  94. return
  95. }
  96. // MustGet property on IDispatch with parameters.
  97. func (d *Dispatch) MustGet(name string, params ...interface{}) (result *VARIANT) {
  98. id, err := d.GetId(name)
  99. if err != nil {
  100. panic(err)
  101. }
  102. result, err = d.Invoke(id, DISPATCH_PROPERTYGET, params)
  103. if err != nil {
  104. panic(err)
  105. }
  106. return
  107. }
  108. // Set property on IDispatch with parameters.
  109. func (d *Dispatch) Set(name string, params ...interface{}) (result *VARIANT, err error) {
  110. id, err := d.GetId(name)
  111. if err != nil {
  112. return
  113. }
  114. result, err = d.Invoke(id, DISPATCH_PROPERTYPUT, params)
  115. return
  116. }
  117. // MustSet property on IDispatch with parameters.
  118. func (d *Dispatch) MustSet(name string, params ...interface{}) (result *VARIANT) {
  119. id, err := d.GetId(name)
  120. if err != nil {
  121. panic(err)
  122. }
  123. result, err = d.Invoke(id, DISPATCH_PROPERTYPUT, params)
  124. if err != nil {
  125. panic(err)
  126. }
  127. return
  128. }
  129. // GetId retrieves ID of name on IDispatch.
  130. func (d *Dispatch) GetId(name string) (id int32, err error) {
  131. var dispid []int32
  132. dispid, err = d.Object.GetIDsOfName([]string{name})
  133. if err != nil {
  134. return
  135. }
  136. id = dispid[0]
  137. return
  138. }
  139. // GetIds retrieves all IDs of names on IDispatch.
  140. func (d *Dispatch) GetIds(names ...string) (dispid []int32, err error) {
  141. dispid, err = d.Object.GetIDsOfName(names)
  142. return
  143. }
  144. // Invoke IDispatch on DisplayID of dispatch type with parameters.
  145. //
  146. // There have been problems where if send cascading params..., it would error
  147. // out because the parameters would be empty.
  148. func (d *Dispatch) Invoke(id int32, dispatch int16, params []interface{}) (result *VARIANT, err error) {
  149. if len(params) < 1 {
  150. result, err = d.Object.Invoke(id, dispatch)
  151. } else {
  152. result, err = d.Object.Invoke(id, dispatch, params...)
  153. }
  154. return
  155. }
  156. // Release IDispatch object.
  157. func (d *Dispatch) Release() {
  158. d.Object.Release()
  159. }
  160. // Connect initializes COM and attempts to load IUnknown based on given names.
  161. func Connect(names ...string) (connection *Connection) {
  162. connection.Initialize()
  163. connection.Load(names...)
  164. return
  165. }