• shellexecute的使用和X64判断


    bool RunConsoleAsAdmin(std::string appPath,
                           std::string param,
                           bool wait)
    {
        LOG_INFO << "RunConsoleAsAdmin start" << std::endl;
        if (!(std::experimental::filesystem::exists(appPath) &&
            std::experimental::filesystem::path(appPath).extension().string() == ".exe"))
        {
            LOG_ERROR << "Exe file not exist: " << appPath;
            return false;
        }
    
        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;
        if (!ShellExecuteEx(&ShExecInfo))
        {
            LOG_ERROR << "Failed to shell execute, path : " << appPath;
            return false;
        }
    
        if (wait)
        {
            DWORD dwRet = WaitForSingleObject(ShExecInfo.hProcess, 1000 * 60 * 15);
            switch (dwRet)
            {
            case WAIT_OBJECT_0:
            {
                //正常退出,直接关闭进程
            }
            break;
            case  WAIT_TIMEOUT:
            default:
            {
                BOOL bIsTure = TerminateProcess(ShExecInfo.hProcess, 0);
                if (!bIsTure)
                {
                    LOG_ERROR << "Failed to  terminateProcess Error:" << GetLastError();
                    CloseHandle(ShExecInfo.hProcess);
                    return false;
                }
            }
            }
        }
        if (ShExecInfo.hProcess)
            CloseHandle(ShExecInfo.hProcess);
        LOG_INFO << "RunConsoleAsAdmin End" << std::endl;
        return true;
    }
    ShellExecuteEx内部有坑。
    1.ShellExecuteEx虽然返回了true,但是要执行的程序并没有被执行。
    2.内部线程空间存在读写错误问题(概率低)。错误码0xC0000005。


    inline bool FreezeAction::Is64Bit_OS()
    {
        bool bRetVal = FALSE;
        SYSTEM_INFO si = { 0 };
        GetNativeSystemInfo(&si);
        if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||
            si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64)
            {
              bRetVal = TRUE;
            }
        return bRetVal;
    }



  • 相关阅读:
    2015多校.Zero Escape (dp减枝 && 滚动数组)
    UVa-11809
    UVa-1588 Kickdown
    UVa-1587
    UVa-10340
    UVa-202
    UVa-1368
    UVa-232 Crossword Answers
    UVa-227
    UVa-455 Periodic Strings
  • 原文地址:https://www.cnblogs.com/gd-luojialin/p/11922964.html
Copyright © 2020-2023  润新知