2012-01-07 15 views
2

ExecDOSプラグインを使用してSQLスクリプトを実行するコマンドラインツールを呼び出すNSISインストーラがあります。 ExecDosは非同期モードで呼び出され、コマンドラインツールが終了するまでプログレスバーの更新とIsDone関数の呼び出しを繰り返します。NSIS ExecDosプラグイン - IsDone関数は一部のコンピュータで動作しますが、他のコンピュータでは動作しません

私が抱えている問題は、IsDoneのチェックでは、プロセスが実際に実行中であると誤って報告しているため、インストーラが終了してもバックグラウンドで処理が続行されるということです。私はそれが上で動作しないコンピュータ間の共通点を見つけることができないので、私は誰かがいくつかのアイデアを持っていることを望んでいる、または私のコードでエラーを見つけることができます。

Function UpdateDatabase 
    !insertmacro SetBannerText "Updating database" 0 0   
    !insertmacro Log "About to update the database" 

    StrCpy $UpdateDatabase_PreviousScriptNumber 0  

    SetShellVarContext all   

    Push "ExecDos::End" # Add a marker for the loop to test for. 
    ExecDos::exec /NOUNLOAD /ASYNC '"$ComSpec" /S /C ""$INSTDIR\Database\Tool\DatabaseResetTool.Console.exe" -sp="$INSTDIR\Database\Scripts" -cs="Data Source=$DatabaseServer;Initial Catalog=$Database;User ID=sa;Password=*********;Persist Security Info=true;MultipleActiveResultSets=True;Language=English" -eoe"' '' '$APPDATA\Company\$ApplicationPrefix\Database Update.log' 
    Pop $DatabaseUpdate_ProcessHandle  
Loop:  
    ExecDos::isdone /NOUNLOAD $DatabaseUpdate_ProcessHandle 
    Pop $DatabaseUpdate_Done  

    StrCpy $0 "$APPDATA\Company\$ApplicationPrefix\Database Update.log" 
    StrCpy $1 "$TEMP\Database Update.log" 
    StrCpy $2 0 
    System::Call 'kernel32::CopyFile(t r0, t r1, b r2) ?e' 

    ${LineRead} "$TEMP\Database Update.log" "-2" $DatabaseUpdate_LogFileLine 

    ${StrTok} $DatabaseUpdate_LogFileLineEndPart $DatabaseUpdate_LogFileLine "(" "L" "1"  
    ${StrTok} $DatabaseUpdate_ScriptNumber $DatabaseUpdate_LogFileLineEndPart "/" "0" "1"  
    ${StrTok} $DatabaseUpdate_ScriptCountUnprocessed $DatabaseUpdate_LogFileLineEndPart "/" "1" "1"  
    ${StrTok} $DatabaseUpdate_ScriptCount $DatabaseUpdate_ScriptCountUnprocessed ")" "0" "1" 

    ${If} $DatabaseUpdate_ScriptNumber != "" 
    ${AndIf} $DatabaseUpdate_ScriptCount != ""   
    FloatOp::D $DatabaseUpdate_ScriptNumber $DatabaseUpdate_ScriptCount   
    FloatOp::M $0 100       

    ${If} $UpdateDatabase_PreviousScriptNumber != $DatabaseUpdate_ScriptNumber            
     !insertmacro SetBannerText "Updating database$\r$\n$\r$\nRunning script $DatabaseUpdate_ScriptNumber of $DatabaseUpdate_ScriptCount" 0 $0 
     StrCpy $UpdateDatabase_PreviousScriptNumber $DatabaseUpdate_ScriptNumber 
    ${EndIf}            
    ${EndIf}  

    Sleep 200 

    StrCmp $DatabaseUpdate_Done "0" Loop Done 
Done: 
    Push "$TEMP\Database Update.log" 
    Push "exception" 
    Call FileSearch 
    Pop $0 
    Pop $1  

    ${If} $0 != "0" 
    StrCpy $InstallError 1 
    !insertmacro LogError "Database update failed. Please review the 'Database Update.log' to see the detail error message" ""   
    ${EndIf}  
FunctionEnd 
+0

ループから壊れたときは、$ DatabaseUpdate_Done 1または-1ですか? – Anders

答えて

3

私は、正確な問題が何であるか知らないが、あなたはおそらく修正する必要があり、あなたのスクリプトといくつかの他の問題を持っている:

  • System::Call 'kernel32::CopyFile(t r0, t r1, b r2) ?e'bは、有効なシステムのプラグインタイプではありません、iを使用します。 ?eはスタックにプッシュしますが、この値をポップすることはなく、コピーが成功したかどうかはチェックしません。リダイレクトがミックスにCMD.EXEを招くことなく動作するはずですのでSystem::Call 'kernel32::CopyFile(t r0, t r1, i 0)i.r0'とそれを交換し、あなたが$ COMSPECと私はcmd.exeの引用の問題に対処するためであると仮定し""を使用している${If} $0 = 0 ...deal with error

  • に確認し、ExecDosはパイプを使用しています。ただExecDos::exec /NOUNLOAD /ASYNC '"$INSTDIR\Da...

  • あなたが本当にあなたには、いくつかの他のものをポップしないとPush "ExecDos::End"

ためのテスト決してあなたのスクラッチ・スペースとして

  • を$ Pluginsdirを使用して、$の温度にあるすべてのファイルをコントロールしていないを実行してみてください調査する必要があるかもしれません:

    • SetShellVarContext allは、一般的なappdata/programdataに変換されますので、あなたは管理者です。
    • ...長い睡眠を試してみてください、それはあなたがポップアップ決して?e値は、関数が無効なパラメータで終わるようisdoneパラメータがスタックにプッシュされることはありませんようにスタックを埋め終わることは可能ですか?あなたはSystem::Call 'kernel32::WaitForSingleObject(i $DatabaseUpdate_ProcessHandle ,i 0)i.r0'でisdoneとreturn values listed on MSDNに$ 0では値を比較するために、コールを交換することができるはずこれをデバッグする

  • +1

    このような私のコードの詳細な調査に感謝します。私はあなたが次の数日間にわたって提案した変更を実装し、そのうちの1つが私が持っている特定の問題を修正することを願っています。 –

    +0

    私はあなたの提案をすべて実装しました。問題は修正されているようですので、もう一度お返事ください。残念なことに、時間のプレッシャーは、私が個々の変更を個別にテストすることができなかったことを意味しています。したがって、どちらが問題の根本かわかりません。 –

    関連する問題