2017-05-19 7 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}." 

ありがとうございました。

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で始まりますか?私はそれを降ろすことについてあなたのポイントを見て、その1つのおかげで。それを削除する前にタスクを終了する必要がありますか、または強制パラメータがありますか? –

+0

おそらくUACを使用して昇格する必要があります。タスクが実行中の場合は、タスクを停止してみてください。正確なエラーコードを教えてください! – Anders

+0

Anders、私はあなたの時間を無駄にして謝罪します。管理者権限を必要とすることを忘れるというような単純な間違いが、何時間ものデバッグで夕方を壊すことは、ひどいことです。 –

関連する問題