Introduction
Perhaps it is just me, but there are a number of times when I have found that I needed to launch (or shell) an executable from within my application. For the most part, I have had to do this to launch a data synchronization client but I am sure there are a number of other reasons why you would need to do this on Windows Mobile. I was somewhat surprised that there were very few examples (that I could find) on how to do this on Windows Mobile.
Although there seem to be many ways to do this, my personal preference has been to use CreateProcess
. I like this because it gives me the ability to either launch the executable and return immediately or I can sit and wait for the application to complete.
This article is meant to explain how I have used the CreateProcess
function to launch an executable. If you know of a better way to do this or know how I can improve the code, I would love to hear from you. If not, I hope you find the code helpful.
Requirements
The following tools are required to get started with developing the application:
Using the Code
The application itself is fairly straightforward. The first thing you will need to do in your application is to add a reference to the following namespace:
using System.Runtime.InteropServices;
Once that is done, you will also need the following declarations in order to execute a program:
public class ProcessInfo
{
public IntPtr hProcess;
public IntPtr hThread;
public IntPtr ProcessID;
public IntPtr ThreadID;
}
[DllImport("CoreDll.DLL", SetLastError = true)]
private static extern int CreateProcess(String imageName, String cmdLine,
IntPtr lpProcessAttributes, IntPtr lpThreadAttributes,
Int32 boolInheritHandles, Int32 dwCreationFlags, IntPtr lpEnvironment,
IntPtr lpszCurrentDir, byte[] si, ProcessInfo pi);
[DllImport("coredll")]
private static extern bool CloseHandle(IntPtr hObject);
[DllImport("coredll")]
private static extern uint WaitForSingleObject
(IntPtr hHandle, uint dwMilliseconds);
[DllImport("coredll.dll", SetLastError = true)]
private static extern int GetExitCodeProcess
(IntPtr hProcess, ref int lpExitCode);
Additionally, we need the following function to make it easier to launch the executable. Notice the line which uses WaitForSingleObject
. This line can be commented out if you do not want to wait for the application to complete.
private void LaunchApp(string strPath, string strParms)
{
ProcessInfo pi = new ProcessInfo();
byte[] si = new byte[128];
CreateProcess(strPath, strParms, IntPtr.Zero, IntPtr.Zero,
0, 0, IntPtr.Zero, IntPtr.Zero, si, pi);
WaitForSingleObject(pi.hProcess, 0xFFFFFFFF);
int exitCode = 0;
GetExitCodeProcess(pi.hProcess, ref exitCode);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return;
}
Now launching the application is simple. The following line will launch the executable with the appropriate parameters:
LaunchApp(textEXE.Text, textParms.Text);
History
- 4th July, 2007: Initial post