Skip to content

Commit 1629df7

Browse files
authored
Fixes for ole.CoInitialize behavior. (#24)
* Fixes for ole.CoInitialize behavior. - Accept err=S_FALSE from ole.CoInitialize. - Call ole.CoUninitialize if we return err for any subsequent reason. * remove defer statements
1 parent c2d8b11 commit 1629df7

File tree

1 file changed

+10
-1
lines changed

1 file changed

+10
-1
lines changed

manage.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,32 @@ import (
1515
"github.com/rickb777/date/period"
1616
)
1717

18+
// S_FALSE is returned by CoInitialize if it was already called on this thread.
19+
const S_FALSE = 0x00000001
20+
1821
func (t *TaskService) initialize() error {
1922
var err error
2023

2124
err = ole.CoInitialize(0)
2225
if err != nil {
23-
return err
26+
code := err.(*ole.OleError).Code()
27+
if code != ole.S_OK && code != S_FALSE {
28+
return err
29+
}
2430
}
2531

2632
schedClassID, err := ole.ClassIDFrom("Schedule.Service.1")
2733
if err != nil {
34+
ole.CoUninitialize()
2835
return getTaskSchedulerError(err)
2936
}
3037
taskSchedulerObj, err := ole.CreateInstance(schedClassID, nil)
3138
if err != nil {
39+
ole.CoUninitialize()
3240
return getTaskSchedulerError(err)
3341
}
3442
if taskSchedulerObj == nil {
43+
ole.CoUninitialize()
3544
return errors.New("Could not create ITaskService object")
3645
}
3746
defer taskSchedulerObj.Release()

0 commit comments

Comments
 (0)