using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using Foo.Platform.Win32; using System.Runtime.InteropServices; using System.Diagnostics; namespace Foo.WorkspaceMgr.Launchers { internal class Launcher_Shell : ILaunch { #region ILaunch Members /// /// Checks to see if the file exists in the system i.e. can be reached over /// the network. if FileExists fails, we shouldn't be able to launch it. /// /// location of the path + file to launch /// public FuncDepBoolType IQueryLaunch(string strArtifactLocation) { if (!String.IsNullOrEmpty(strArtifactLocation) && (strArtifactLocation.Length > 3)) { if (File.Exists(strArtifactLocation)) return FuncDepBoolType.Success; else return FuncDepBoolType.ArtifactLocationUnavailable; } else { return FuncDepBoolType.ParametersInvalid; } } /// /// Generic Launcher should be able to handle any file type using Shell Execute /// ~This is NOT the same as Process.start(). When using ShellExecute, Excel workbooks /// launch in a different window (and for some reason Don't SHOW UP in the Excel DOM) /// ~this is why this is broken out (more testing is needed) /// /// location of the path + file to launch /// public FuncDepBoolType ILaunch(string strArtifactLocation) { if (!String.IsNullOrEmpty(strArtifactLocation) && (strArtifactLocation.Length > 3)) { // Shellexecute works almost just like process.start except for the limitation // mentioned: // We could do process start but doing so means all excel docs open in the same // excel window (just like powerpoint does) ~this may or may not be desirable // ~excel docs won't show in the DOM, after being launched this way ~ - very odd bool bIsValidExe = false; string strExeOrDllPath = string.Empty; bool bFound = Win32_WrapperFunc.FindExeOrDll(strArtifactLocation, out strExeOrDllPath, out bIsValidExe); const int SEE_MASK_NOCLOSEPROCESS = 0x40; ShellExecuteInfo sei = new ShellExecuteInfo(); sei.cbSize = Marshal.SizeOf(sei); sei.lpVerb = "open"; sei.lpParameters = '\"' + strArtifactLocation + '\"'; sei.nShow = (int)WindowAction.SW_SHOWNORMAL; sei.fMask = SEE_MASK_NOCLOSEPROCESS; // Use Shell32 or Explorer to launch the artifact if (bFound && bIsValidExe) sei.lpFile = strExeOrDllPath; else sei.lpFile = '\"' + Win32_WrapperFunc.GetWindowsPath() + "\\explorer.exe" + '\"'; if (Win32Functions.ShellExecuteEx(ref sei)) return FuncDepBoolType.Success; else return FuncDepBoolType.Failed; } return FuncDepBoolType.ParametersInvalid; } #endregion } }