7 using System.Runtime.InteropServices;
18 [DllImport(
"ExternalProcessAPI", CallingConvention = CallingConvention.Cdecl)]
19 private static extern IntPtr ExternalProcessAPI_CreateProcess([MarshalAs(UnmanagedType.LPStr)]
string cmdline);
20 [DllImport(
"ExternalProcessAPI", CallingConvention = CallingConvention.Cdecl)]
21 private static extern bool ExternalProcessAPI_IsRunning(IntPtr handle);
22 [DllImport(
"ExternalProcessAPI", CallingConvention = CallingConvention.Cdecl)]
23 private static extern void ExternalProcessAPI_SendLine(IntPtr handle, [MarshalAs(UnmanagedType.LPStr)]
string line);
24 [DllImport(
"ExternalProcessAPI", CallingConvention = CallingConvention.Cdecl)]
25 private static extern IntPtr ExternalProcessAPI_GetLine(IntPtr handle);
26 [DllImport(
"ExternalProcessAPI", CallingConvention = CallingConvention.Cdecl)]
27 private static extern void ExternalProcessAPI_DestroyProcess(IntPtr handle);
28 [DllImport(
"ExternalProcessAPI", CallingConvention = CallingConvention.Cdecl)]
29 public static extern void ExternalProcessAPI_ConfirmOrBeginProcess([MarshalAs(UnmanagedType.LPStr)]
string processName);
31 private IntPtr mHandle;
37 private static string sAppDataPath;
39 public static void Launch(
string appName)
43 if (!appName.StartsWith(
@"\"))
48 string appPath = AppDataPath + appName;
49 string appDir = Path.GetDirectoryName(appPath);
51 Process pr =
new Process();
52 pr.StartInfo.FileName = appPath;
53 pr.StartInfo.WorkingDirectory = appDir;
57 private static string AppDataPath
61 if (
string.IsNullOrEmpty(sAppDataPath))
63 sAppDataPath = Application.dataPath.Replace(
"/",
@"\");
72 return FindAndLaunch(appName, null);
80 string appPath = FindPathToExecutable(appName);
86 string appDir = Path.GetDirectoryName(appPath);
88 Process pr =
new Process();
89 pr.StartInfo.FileName = appPath;
90 pr.StartInfo.WorkingDirectory = appDir;
91 pr.StartInfo.Arguments = args;
101 if (!appName.StartsWith(
@"\"))
103 appName =
@"\" + appName;
106 string searchDir = AppDataPath;
108 while (searchDir.Length > 3)
110 string appPath = searchDir + appName;
112 if (File.Exists(appPath))
117 searchDir = Path.GetDirectoryName(searchDir);
127 path1 = path1.Replace(
'\\',
'/');
128 path2 = path2.Replace(
'\\',
'/');
129 path1 = path1.Replace(
"\"",
"");
130 path2 = path2.Replace(
"\"",
"");
132 Uri uri1 =
new Uri(path1);
133 Uri uri2 =
new Uri(path2);
134 Uri relativePath = uri1.MakeRelativeUri(uri2);
135 return relativePath.OriginalString;
145 return CreateExternalProcess(appName, null);
157 UnityEngine.Debug.LogError(
"Unable to start process " + appName +
", " + ex.Message +
".");
164 appName = appName.Replace(
"/",
@"\");
165 string appPath = appName;
166 if (!File.Exists(appPath))
168 appPath = FindPathToExecutable(appName);
173 throw new ArgumentException(
"Unable to find app " + appPath);
177 string launchString = args == null ? appPath : appPath +
" " + args;
178 mHandle = ExternalProcessAPI_CreateProcess(launchString);
190 if (mHandle != IntPtr.Zero)
192 return ExternalProcessAPI_IsRunning(mHandle);
205 return WaitFor(seconds, () => {
return ExternalProcessAPI_IsRunning(mHandle); });
210 return WaitFor(seconds, () => {
return !ExternalProcessAPI_IsRunning(mHandle); });
213 public bool WaitFor(
float seconds, Func<bool> func)
217 float end = Time.realtimeSinceStartup + seconds;
219 bool hasHappened =
false;
220 while (Time.realtimeSinceStartup < end)
222 hasHappened = func();
227 Thread.Sleep(Math.Min(500, (
int)(seconds * 1000)));
236 if (mHandle != IntPtr.Zero)
238 ExternalProcessAPI_SendLine(mHandle, line);
251 if (mHandle != IntPtr.Zero)
253 return Marshal.PtrToStringAnsi(ExternalProcessAPI_GetLine(mHandle));
268 if (mHandle != IntPtr.Zero)
270 ExternalProcessAPI_DestroyProcess(mHandle);
278 mHandle = IntPtr.Zero;
286 GC.SuppressFinalize(
this);
289 protected virtual void Dispose(
bool disposing)