#include "shellprv.h" #pragma hdrstop BOOL _CopyCommand(LPCTSTR pszCommand, LPCTSTR pszDir, LPTSTR pszOut, DWORD cchOut) { BOOL fCopyBack = TRUE; BOOL fRet = TRUE; // if it does not have quotes, try unquoted name to see if that works... if (pszCommand[0] != TEXT('"')) { if (UrlIs(pszCommand, URLIS_URL)) { // urls never have params... fCopyBack = fRet = FALSE; lstrcpyn(pszOut, pszCommand, cchOut); } else if (StrChr(pszCommand, TEXT(' '))) { lstrcpyn(pszOut, pszCommand, cchOut); PathQualifyDef(pszOut, pszDir, 0); // Check for possible existence of arguments if (PathFileExistsAndAttributes(pszOut, NULL)) { fCopyBack = fRet = FALSE; } } else fRet = FALSE; } // we need to put the original command for args parsing if (fCopyBack) lstrcpyn(pszOut, pszCommand, cchOut); return fRet; } BOOL _QualifyWorkingDir(LPCTSTR pszPath, LPTSTR pszDir, DWORD cchDir) { // special case to make sure the working dir gets set right: // 1) no working dir specified // 2) a drive or a root path, or a relative path specified // derive the working dir from the qualified path. this is to make // sure the working dir for setup programs "A:setup" is set right if (StrChr(pszPath, TEXT('\\')) || StrChr(pszPath, TEXT(':'))) { // build working dir based on qualified path lstrcpyn(pszDir, pszPath, cchDir); PathQualifyDef(pszDir, NULL, PQD_NOSTRIPDOTS); PathRemoveFileSpec(pszDir); return TRUE; } return FALSE; } // Run the thing, return TRUE if everything went OK BOOL ShellExecCmdLine(HWND hwnd, LPCTSTR pszCommand, LPCTSTR pszDir, int nShow, LPCTSTR pszTitle, DWORD dwFlags) { TCHAR szWD[MAX_PATH]; TCHAR szFileName[MAX_PATH]; LPTSTR pszArgs; SHELLEXECUTEINFO ei = {0}; if (pszDir && *pszDir == TEXT('\0')) pszDir = NULL; if (_CopyCommand(pszCommand, pszDir, szFileName, SIZECHARS(szFileName))) { // there might be args in that command pszArgs = PathGetArgs(szFileName); if (*pszArgs) *(pszArgs - 1) = TEXT('\0'); } else pszArgs = NULL; PathUnquoteSpaces(szFileName); // this needs to be here. app installs rely on the current directory // to be the directory with the setup.exe if (!UrlIs(szFileName, URLIS_URL) && ((dwFlags & SECL_USEFULLPATHDIR) || !pszDir)) { if (_QualifyWorkingDir(szFileName, szWD, SIZECHARS(szWD))) pszDir = szWD; } FillExecInfo(ei, hwnd, NULL, szFileName, pszArgs, pszDir, nShow); ei.fMask = SEE_MASK_FLAG_DDEWAIT | SEE_MASK_DOENVSUBST; if (dwFlags & SECL_NO_UI) ei.fMask |= SEE_MASK_FLAG_NO_UI; if (dwFlags & SECL_SEPARATE_VDM) ei.fMask |= SEE_MASK_FLAG_SEPVDM; if (dwFlags & SECL_LOG_USAGE) ei.fMask |= SEE_MASK_FLAG_LOG_USAGE; return ShellExecuteEx(&ei); }