そして、X64は、ShellExecuteをを使用して決定されます

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と、
}

 




おすすめ

転載: www.cnblogs.com/gd-luojialin/p/11922964.html