2008/01/28(Mon) 20:38:23 編集(投稿者)
>これ以外では特に、気にするようなところはないかと。
すいません。お時間とらせて^^;
たしかにCloseHandle()がないのは問題ありでした。
throw 1 する前にも、チェックが必要ですので、んーーーー。
こんな感じでいかがでしょうか。
ret -1; より GetLastError?
/*---------------------------------------------*/
/** Msiインストーラー起動
* @ return 終了コード
* 0 :(ERROR_SUCCESS)成功
* -1 : 予期しないエラー
* 3010 :(ERROR_SUCCESS_REBOOT_REQUIRED)なら、インストール成功だが、マシンリブートが必要。
* 1600〜1699:msi の実行エラーコード(キャンセルを含む)
*/
/*---------------------------------------------*/
DWORD MsiInstallCmd( LPCTSTR pszCmd )
{
SHELLEXECUTEINFO sei = { 0 };
DWORD ret = ERROR_SUCCESS;
//構造体のサイズ
sei.cbSize = sizeof(SHELLEXECUTEINFO);
//起動側のウインドウハンドル
sei.hwnd = NULL;
sei.hProcess = NULL;
//起動後の表示状態
sei.nShow = SW_SHOWNORMAL;
//このパラメータが重要で、セットしないとSHELLEXECUTEINFO構造体のhProcessメンバがセットされない。
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
//起動プログラム
sei.lpFile = (LPCSTR)pszCmd;
try{
//プロセス起動
if(!ShellExecuteEx(&sei)){
throw 1;
}
//NULLチェック
if(sei.hProcess == NULL) {
throw 1;
}
//終了を待つ
WaitForSingleObject(sei.hProcess, INFINITE);
//終了コード取得
if(!GetExitCodeProcess(sei.hProcess, &ret)) {
throw 1;
}
}catch(...) {
ret = -1;
}
//開放
if(sei.hProcess != NULL) {
CloseHandle(sei.hProcess);
}
return ret;
}