Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,9 @@ func getRunningTaskError(err error) error {
func getOLEErrorCode(err error) (uint32, error) {
if oleErr, ok1 := err.(*ole.OleError); ok1 {
if excepInfo, ok2 := oleErr.SubError().(ole.EXCEPINFO); ok2 {
return excepInfo.SCODE(), nil
code := excepInfo.SCODE()
excepInfo.Clear()
return code, nil
} else {
return uint32(oleErr.Code()), errors.New("failed to extract OLE sub-error code")
}
Expand Down
6 changes: 5 additions & 1 deletion fill.go
Original file line number Diff line number Diff line change
Expand Up @@ -258,9 +258,13 @@ func fillTrigger(triggersObj *ole.IDispatch, trigger Trigger) error {
defer valueQueriesObj.Release()

for name, value := range t.ValueQueries {
if _, err := oleutil.CallMethod(valueQueriesObj, "Create", name, value); err != nil {
res, err := oleutil.CallMethod(valueQueriesObj, "Create", name, value)
if err != nil {
return fmt.Errorf("error creating value %s: %w", name, getTaskSchedulerError(err))
}
if pairObj := res.ToIDispatch(); pairObj != nil {
pairObj.Release()
}
}
case IdleTrigger:
idleTriggerObj := h.query(triggerObj, ole.NewGUID("{d537d2b0-9fb3-4d34-9739-1ff5ce7b1ef3}"))
Expand Down
28 changes: 26 additions & 2 deletions manage.go
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,7 @@ func (t *TaskService) GetRunningTasks() (RunningTaskCollection, error) {
return nil
})
if err != nil {
runningTasks.Release()
return nil, err
}

Expand All @@ -208,6 +209,13 @@ func (t *TaskService) GetRegisteredTasks() (RegisteredTaskCollection, error) {
registeredTasks RegisteredTaskCollection
)

success := false
defer func() {
if !success {
registeredTasks.Release()
}
}()

// get tasks from root folder
res, err := oleutil.CallMethod(t.rootFolderObj, "GetTasks", int(TASK_ENUM_HIDDEN))
if err != nil {
Expand Down Expand Up @@ -285,6 +293,7 @@ func (t *TaskService) GetRegisteredTasks() (RegisteredTaskCollection, error) {
return nil, err
}

success = true
return registeredTasks, nil
}

Expand Down Expand Up @@ -348,6 +357,7 @@ func (t TaskService) GetTasksInFolder(path string) (RegisteredTaskCollection, er
return nil
})
if err != nil {
registeredTasks.Release()
return nil, err
}

Expand Down Expand Up @@ -388,6 +398,13 @@ func (t TaskService) GetTaskFolder(path string) (TaskFolder, error) {
topFolderTaskCollection := res.ToIDispatch()
defer topFolderTaskCollection.Release()
topFolder := TaskFolder{Path: `\`}

success := false
defer func() {
if !success {
topFolder.Release()
}
}()
err = oleutil.ForEach(topFolderTaskCollection, func(v *ole.VARIANT) error {
task := v.ToIDispatch()

Expand Down Expand Up @@ -476,6 +493,7 @@ func (t TaskService) GetTaskFolder(path string) (TaskFolder, error) {
return TaskFolder{}, err
}

success = true
return topFolder, nil
}

Expand Down Expand Up @@ -778,19 +796,25 @@ func (t *TaskService) DeleteTask(path string) error {
}

func (t *TaskService) registeredTaskExist(path string) bool {
_, err := oleutil.CallMethod(t.rootFolderObj, "GetTask", path)
res, err := oleutil.CallMethod(t.rootFolderObj, "GetTask", path)
if err != nil {
return false
}
if taskObj := res.ToIDispatch(); taskObj != nil {
taskObj.Release()
}

return true
}

func (t *TaskService) taskFolderExist(path string) bool {
_, err := oleutil.CallMethod(t.taskServiceObj, "GetFolder", path)
res, err := oleutil.CallMethod(t.taskServiceObj, "GetFolder", path)
if err != nil {
return false
}
if folderObj := res.ToIDispatch(); folderObj != nil {
folderObj.Release()
}

return true
}
23 changes: 21 additions & 2 deletions parse.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,33 +13,43 @@ import (
"github.com/go-ole/go-ole/oleutil"
)

func parseRunningTask(task *ole.IDispatch) (RunningTask, error) {
var err error
func parseRunningTask(task *ole.IDispatch) (_ RunningTask, err error) {
defer func() {
if err != nil && task != nil {
task.Release()
}
}()

currentAction, err := oleutil.GetProperty(task, "CurrentAction")
if err != nil {
return RunningTask{}, getRunningTaskError(err)
}
defer currentAction.Clear()
enginePID, err := oleutil.GetProperty(task, "EnginePid")
if err != nil {
return RunningTask{}, getRunningTaskError(err)
}
defer enginePID.Clear()
instanceGUID, err := oleutil.GetProperty(task, "InstanceGuid")
if err != nil {
return RunningTask{}, getRunningTaskError(err)
}
defer instanceGUID.Clear()
name, err := oleutil.GetProperty(task, "Name")
if err != nil {
return RunningTask{}, getRunningTaskError(err)
}
defer name.Clear()
path, err := oleutil.GetProperty(task, "Path")
if err != nil {
return RunningTask{}, getRunningTaskError(err)
}
defer path.Clear()
state, err := oleutil.GetProperty(task, "State")
if err != nil {
return RunningTask{}, getRunningTaskError(err)
}
defer state.Clear()

runningTask := RunningTask{
taskObj: task,
Expand All @@ -55,6 +65,13 @@ func parseRunningTask(task *ole.IDispatch) (RunningTask, error) {
}

func parseRegisteredTask(task *ole.IDispatch) (RegisteredTask, string, error) {
success := false
defer func() {
if !success && task != nil {
task.Release()
}
}()

h := &oleHelper{}

name := h.getString(task, "Name")
Expand Down Expand Up @@ -185,6 +202,8 @@ func parseRegisteredTask(task *ole.IDispatch) (RegisteredTask, string, error) {
LastTaskResult: lastTaskResult,
}

// Ownership of task now belongs to registeredTask; don't release it.
success = true
return registeredTask, path, nil
}

Expand Down
Loading