BOOL RunConsoleAsAdmin(のstd :: 文字列APPPATH、 STD :: 文字列のparam、 ブール待ち) { LOG_INFOは << " スタートRunConsoleAsAdmin " << はstd ::てendlを。 もし(!(STD ::実験::ファイルシステム::(APPPATH)&&存在する のstd ::実験::ファイルシステム::パス(APPPATH)。拡張子()。文字列()== " .EXE " )) { LOG_ERROR < < " EXEファイルは存在しません:" << APPPATHを。 偽; } SHELLEXECUTEINFO ShExecInfo = { 0 }。 ShExecInfo.cbSize = はsizeof (SHELLEXECUTEINFO)。 ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS。 ShExecInfo.hwnd = NULL; ShExecInfo.lpVerb = " runasコマンド" 。 ShExecInfo.lpFile = appPath.c_str()。 ShExecInfo.lpParameters = param.c_str()。 ShExecInfo.lpDirectory = NULL; ShExecInfo.nShow = SW_HIDE。 ShExecInfo.hInstApp= NULL; もし(!ShellExecuteExを(&ShExecInfo)) { LOG_ERROR << " 実行シェルに失敗しました、パス:" << APPPATH。 リターン はfalse ; } 場合(待機) { DWORD dwRet =のWaitForSingleObject(ShExecInfo.hProcess、1000年 * 60 * 15 )。 スイッチ(dwRet) { ケースWAIT_OBJECT_0: { // 正常退出、直接关闭进程 } ブレーク。 ケース WAIT_TIMEOUT: デフォルト: { BOOL bIsTure =のTerminateProcess(ShExecInfo.hProcess、0 ); もし(!bIsTure) { LOG_ERROR << " のTerminateProcessエラーに失敗しました:" << のGetLastError(); CloseHandleを(ShExecInfo.hProcess)。 リターン はfalse ; } } } } もし(ShExecInfo.hProcess) CloseHandleを(ShExecInfo.hProcess)。 LOG_INFO <<" RunConsoleAsAdminエンド" << はstd ::てendl; 返す 真; }
内部ShellExecuteExをピット。
けれども1.ShellExecuteExはtrueを返しますが、プログラムが実行され、実行されませんことを。
2.内部スレッドエラーリテラシーの問題(低確率)の余地があります。エラーコード0xc0000005で。
インラインBOOL FreezeAction :: Is64Bit_OS() { BOOL bRetVal = FALSE。 SYSTEM_INFO SI = { 0 }。 GetNativeSystemInfo( &SI)。 もし(si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 || si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64) { bRetValは = TRUE。 } 戻りbRetValと、 }