Click here to Skip to main content
15,885,365 members
Articles / Mobile Apps / Windows Mobile

Launch an Executable Programatically on Windows Mobile using CreateProcess and C#

Rate me:
Please Sign up or sign in to vote.
4.00/5 (2 votes)
4 Jul 2007CPOL2 min read 61K   594   31   9
The following article explains how to launch an executable from within your application on Windows Mobile using C#.

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:

C#
using System.Runtime.InteropServices;

Once that is done, you will also need the following declarations in order to execute a program:

C#
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.

C#
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);
	// This line can be commented out if you do not want 
	// to wait for the process to exit
	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:

C#
LaunchApp(textEXE.Text, textParms.Text);

History

  • 4th July, 2007: Initial post

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
United States United States
Liam Cavanagh currently works as a Sr. Program Manager for Microsoft focusing new cloud services in the SQL Azure organization. Within this group, Liam has created a number of new services including SQL Azure Data Sync, Microsoft Codename "Data Transfer", and Eye on Earth leveraging the Windows Azure infrastucture.

Additionally, he works with enterprise corporations implementing enterprise cloud and mobile solutions and conducts training seminars worldwide.

Liam holds a Bachelor of Mathematics degree in Business and Information Systems from the University of Waterloo in Waterloo, Ontario, Canada.

Specialties: Windows Azure, SQL Azure, SQL Server, Cloud, Mobile, Replication and Database Synchronization Technologies

Liam Cavanagh is the founder of Cotega, a data notificaton and scheduling service for cloud databases. You can contact Liam at his cloud data blog.

Comments and Discussions

 
GeneralExecute a external application without displaying any messagebox Pin
Member 68709113-Jan-10 2:19
Member 68709113-Jan-10 2:19 
GeneralRe: Execute a external application without displaying any messagebox Pin
ajaythackeracs22-Jul-10 5:27
ajaythackeracs22-Jul-10 5:27 
QuestionThank you but how about relative path? Pin
Epon2-Apr-09 23:44
Epon2-Apr-09 23:44 
AnswerRe: Thank you but how about relative path? Pin
Epon3-Apr-09 0:34
Epon3-Apr-09 0:34 
GeneralTo run CreateProcess .... Pin
vijaywithu24-Feb-09 17:52
vijaywithu24-Feb-09 17:52 
GeneralThank you very much! Pin
Member 442059919-Jun-08 0:58
Member 442059919-Jun-08 0:58 
GeneralAbout FTP applicaqtion for Mobile Pin
ndas.net29-Apr-08 23:28
ndas.net29-Apr-08 23:28 
GeneralHave you tried System.Diagnostics.Process...Not sure if this works in Embedded Env. Pin
AnandChavali4-Jul-07 20:28
AnandChavali4-Jul-07 20:28 
GeneralRe: Have you tried System.Diagnostics.Process...Not sure if this works in Embedded Env. Pin
Liam Cavanagh5-Jul-07 9:57
Liam Cavanagh5-Jul-07 9:57 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.