bool WinExecuteAdmin( const wxString& command, const wxString& params ) { SHELLEXECUTEINFO shExecInfo; shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); shExecInfo.fMask = 0; shExecInfo.hwnd = NULL; //on XP this would open the real runas dialog, which apparently is its own wonder //by default it has a checkbox enabled which makes sl unable to write to the working dir... if ( IsUACenabled() ) { if ( IsPreVistaWindows() ) shExecInfo.lpVerb = _T("open"); else shExecInfo.lpVerb = _T("runas"); #ifdef _MSC_VER //some strange compiler stupidity going on here shExecInfo.lpFile = command.c_str(); shExecInfo.lpParameters = params.c_str(); #else shExecInfo.lpFile = command.wc_str(); shExecInfo.lpParameters = params.wc_str(); #endif shExecInfo.lpDirectory = NULL; shExecInfo.hInstApp = NULL; } return ShellExecuteEx(&shExecInfo); }
int RunProcess(const wxString& cmd, const wxArrayString& params, const bool /*async*/, const bool /*root*/) #endif { wxString paramstring; for (wxString param : params) { if (!paramstring.empty()) { paramstring += _T(" "); } paramstring += escapeStr(param); } wxLogDebug(_T("going to run %s %s"), cmd.c_str(), paramstring.c_str()); #ifdef __WXMSW__ SHELLEXECUTEINFO ShExecInfo; DWORD exitCode = 0; ShExecInfo.lpVerb = _T("open"); ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; ShExecInfo.hwnd = NULL; ShExecInfo.lpFile = cmd.t_str(); ShExecInfo.lpParameters = paramstring.t_str(); ShExecInfo.lpDirectory = NULL; ShExecInfo.nShow = SW_SHOW; ShExecInfo.hInstApp = NULL; if (root && IsUACenabled()) { if (!IsPreVistaWindows()) ShExecInfo.lpVerb = _T("runas"); } int res = ShellExecuteEx(&ShExecInfo); if (async) return (res > 32); WaitForSingleObject(ShExecInfo.hProcess, INFINITE); GetExitCodeProcess(ShExecInfo.hProcess, &exitCode); return exitCode; #else wxString realcmd = escapeStr(cmd); if (!paramstring.empty()) { realcmd += _T(" ") + paramstring; } return system(realcmd.mb_str(wxConvUTF8)); #endif }