oleutil.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package oleutil
  2. import ole "github.com/gofiber/fiber/v2/internal/go-ole"
  3. // ClassIDFrom retrieves class ID whether given is program ID or application string.
  4. func ClassIDFrom(programID string) (classID *ole.GUID, err error) {
  5. return ole.ClassIDFrom(programID)
  6. }
  7. // CreateObject creates object from programID based on interface type.
  8. //
  9. // Only supports IUnknown.
  10. //
  11. // Program ID can be either program ID or application string.
  12. func CreateObject(programID string) (unknown *ole.IUnknown, err error) {
  13. classID, err := ole.ClassIDFrom(programID)
  14. if err != nil {
  15. return
  16. }
  17. unknown, err = ole.CreateInstance(classID, ole.IID_IUnknown)
  18. if err != nil {
  19. return
  20. }
  21. return
  22. }
  23. // GetActiveObject retrieves active object for program ID and interface ID based
  24. // on interface type.
  25. //
  26. // Only supports IUnknown.
  27. //
  28. // Program ID can be either program ID or application string.
  29. func GetActiveObject(programID string) (unknown *ole.IUnknown, err error) {
  30. classID, err := ole.ClassIDFrom(programID)
  31. if err != nil {
  32. return
  33. }
  34. unknown, err = ole.GetActiveObject(classID, ole.IID_IUnknown)
  35. if err != nil {
  36. return
  37. }
  38. return
  39. }
  40. // CallMethod calls method on IDispatch with parameters.
  41. func CallMethod(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT, err error) {
  42. return disp.InvokeWithOptionalArgs(name, ole.DISPATCH_METHOD, params)
  43. }
  44. // MustCallMethod calls method on IDispatch with parameters or panics.
  45. func MustCallMethod(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT) {
  46. r, err := CallMethod(disp, name, params...)
  47. if err != nil {
  48. panic(err.Error())
  49. }
  50. return r
  51. }
  52. // GetProperty retrieves property from IDispatch.
  53. func GetProperty(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT, err error) {
  54. return disp.InvokeWithOptionalArgs(name, ole.DISPATCH_PROPERTYGET, params)
  55. }
  56. // MustGetProperty retrieves property from IDispatch or panics.
  57. func MustGetProperty(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT) {
  58. r, err := GetProperty(disp, name, params...)
  59. if err != nil {
  60. panic(err.Error())
  61. }
  62. return r
  63. }
  64. // PutProperty mutates property.
  65. func PutProperty(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT, err error) {
  66. return disp.InvokeWithOptionalArgs(name, ole.DISPATCH_PROPERTYPUT, params)
  67. }
  68. // MustPutProperty mutates property or panics.
  69. func MustPutProperty(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT) {
  70. r, err := PutProperty(disp, name, params...)
  71. if err != nil {
  72. panic(err.Error())
  73. }
  74. return r
  75. }
  76. // PutPropertyRef mutates property reference.
  77. func PutPropertyRef(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT, err error) {
  78. return disp.InvokeWithOptionalArgs(name, ole.DISPATCH_PROPERTYPUTREF, params)
  79. }
  80. // MustPutPropertyRef mutates property reference or panics.
  81. func MustPutPropertyRef(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT) {
  82. r, err := PutPropertyRef(disp, name, params...)
  83. if err != nil {
  84. panic(err.Error())
  85. }
  86. return r
  87. }
  88. func ForEach(disp *ole.IDispatch, f func(v *ole.VARIANT) error) error {
  89. newEnum, err := disp.GetProperty("_NewEnum")
  90. if err != nil {
  91. return err
  92. }
  93. defer newEnum.Clear()
  94. enum, err := newEnum.ToIUnknown().IEnumVARIANT(ole.IID_IEnumVariant)
  95. if err != nil {
  96. return err
  97. }
  98. defer enum.Release()
  99. for item, length, err := enum.Next(1); length > 0; item, length, err = enum.Next(1) {
  100. if err != nil {
  101. return err
  102. }
  103. if ferr := f(&item); ferr != nil {
  104. return ferr
  105. }
  106. }
  107. return nil
  108. }