2017-05-19 1 views
0
!define GUIDTaskScheduler "{148BD52A-A2AB-11CE-B11F-00AA00530503}" 
!define GUIDITaskScheduler "{148BD527-A2AB-11CE-B11F-00AA00530503}" 

Function DeleteTask 
    !define DeleteTask "!insertmacro _DeleteTask" 
    !macro _DeleteTask _TASK _RESULT 
     Push ${_Task} 
     Call DeleteTask 
     Pop ${_RESULT} 
    !macroend 
    Exch $0 
    Push $1 
    Push $2 
    StrCpy $0 false 
    System::Call "ole32::CoCreateInstance(g'${GUIDTaskScheduler}',i0,i11,g '${GUIDITaskScheduler}',*i.r1)i.r2" 
    IntCmp $2 0 0 +4 
    System::Call '$1->7(w r0)i.r2' 
    IntCmp $2 0 0 +2 
    StrCpy $0 true 
    Pop $2 
    Pop $1 
    END: 
    Exch $0 
FunctionEnd 

${DeleteTask} "TaskName" $0 
Pop $0 

$ 0을 true 또는 1로 설정해야하지만 false입니다. 작업이 삭제되지 않습니다.ITaskScheduler :: Delete가 실패합니다.

내가 뭘 잘못하고 있니?

+0

$ 2의 오류 코드는 무엇입니까? – Anders

+0

오류가 발생하면 0과 1로 설정해야한다고 생각합니다. 나는 아직도 아주 새롭다. –

+0

나는 지루한 'schtasks cmdline을 사용하여 문제를 해결할 수있었습니다. 그러나 이것은 내가 잘못 생각한 것까지 끝까지 귀찮게 될 것입니다. –

답변

0

알아 냈습니다. 이것은 끝까지 나를 괴롭 히고 있었다. 그러나 나는 그것을 다시 작성하고 난 후에 그것을 해결할 수 있었다. 여기에 작동 기능이 있습니다.

Function DeleteTask 
    !define TaskGUID `{148BD52A-A2AB-11CE-B11F-00AA00530503}` 
    !define ITaskGUID `{148BD527-A2AB-11CE-B11F-00AA00530503}` 
    !define OLE   `ole32::CoCreateInstance(g"${TaskGUID}",` 
    !define OLE32  `${OLE}i0,i11,g "${ITaskGUID}",*i.r1)i.r2` 
    !define DeleteTask "!insertmacro _DeleteTask" 
    !macro _DeleteTask _RESULT _TASK 
     Push ${_Task} 
     Call DeleteTask 
     Pop ${_RESULT} 
    !macroend 
    Exch $0 
    Push $0 
    Push $1 
    Push $2 
    Push $3 
    StrCpy $3 false 
    System::Call `${OLE32}` 
    IntCmp $2 0 0 +5 
    System::Call "$1->7(w r0)i.r2" 
    IntCmp $2 0 0 +3 
    System::Call "$1->2()" 
    StrCpy $3 true 
    Pop $2 
    Pop $1 
    Pop $0 
    Exch $3 
FunctionEnd 

;= $0 Should return either true on success or false on failure. 
${DeleteTask} $0 "Task Name" 
StrCmpS $0 true 0 +2 
DetailPrint "${TASK} was successfully deleted." 
DetailPrint "Failed to remove the task ${TASK}." 

감사합니다. Anders에게 도움을 청합니다.

1

HRESULT 오류를 인쇄하면 실마리를 얻을 수 있습니다.

StrCpy $0 false으로 서비스 이름을 덮어 쓰는 것 같습니다.

인터페이스를 완료 한 후에 $ 1에서 인터페이스를 릴리스해야합니다.

!define GUIDTaskScheduler "{148BD52A-A2AB-11CE-B11F-00AA00530503}" 
!define GUIDITaskScheduler "{148BD527-A2AB-11CE-B11F-00AA00530503}" 

Function DeleteTask 
!define DeleteTask "!insertmacro _DeleteTask" 
!macro _DeleteTask _TASK _RESULT 
    Push ${_Task} 
    Call DeleteTask 
    Pop ${_RESULT} 
!macroend 
    Exch $0 
    Push $1 
    Push $2 
    System::Call "ole32::CoCreateInstance(g'${GUIDTaskScheduler}',i0,i11,g '${GUIDITaskScheduler}',*i.r1)i.r2" 
    IntCmp $2 0 "" fail 
    System::Call '$1->7(w r0)i.r2' ; Delete($0) 
    System::Call '$1->2()' ; Release 
    fail: 
    StrCpy $0 $2 ; HRESULT 
    Pop $2 
    Pop $1 
    Exch $0 
FunctionEnd 

Section 
${DeleteTask} "TaskName" $0 
DetailPrint HRESULT=$0 
SectionEnd 
+0

작동하지 않았습니다. 'HRESULT = -21457464'. 정확하게 그 수는 아니지만 그것과 비슷하지만 -2로 시작합니다 ???? 나는 그것을 언 로딩하는 것에 대한 당신의 요지를 보았습니다. 작업을 제거하기 전에 작업을 종료해야합니까, 아니면 강제 매개 변수가 있습니까? –

+0

아마도 UAC로 승격해야합니다. 작업이 실행중인 경우 중지하십시오. 정확한 오류 코드를 알려줘야합니다! – Anders

+0

Anders, 시간 낭비에 사과드립니다. 관리 권한이 필요하다는 것을 잊어 버리는 것과 같은 간단한 실수가 몇 시간 동안 디버깅을하면서 저녁을 망칠 수 있다는 것은 끔찍한 일입니다. –

관련 문제