CreateProcess (kernel32)
Last changed: -83.249.236.115

.
Summary
Creates a new process and its primary thread.

C# Signature:

[DllImport("kernel32.dll")]
static extern bool CreateProcess(string lpApplicationName,
   string lpCommandLine, ref SECURITY_ATTRIBUTES lpProcessAttributes,
   ref SECURITY_ATTRIBUTES lpThreadAttributes, bool bInheritHandles,
   uint dwCreationFlags, IntPtr lpEnvironment, string lpCurrentDirectory,
   [In] ref STARTUPINFO lpStartupInfo,
   out PROCESS_INFORMATION lpProcessInformation);

VB Signature:

<DllImport("kernel32.dll")> _
Shared Function CreateProcess(lpApplicationName As String, _
   lpCommandLine As String, ByRef lpProcessAttributes As SECURITY_ATTRIBUTES, _
   ByRef lpThreadAttributes As SECURITY_ATTRIBUTES,bInheritHandles As Boolean, _
   dwCreationFlags As UInt32, lpEnvironment As IntPtr, lpCurrentDirectory As String, _
   <[In]> ByRef lpStartupInfo As STARTUPINFO, _
   <[Out]> ByRef lpProcessInformation As PROCESS_INFORMATION) As Boolean
End Function

User-Defined Types:

STARTUPINFO, PROCESS_INFORMATION, SECURITY_ATTRIBUTES

Notes:

This is great for starting an external app and then use the PID and handle for calls to functions such as WaitForSingleObject and all window message functions.

Tips & Tricks:

Add this in constructor of a class to logically treat the app as an object.

Sample Code C#:

public static void StartupNotepad()
{
     const uint NORMAL_PRIORITY_CLASS = 0x0020;

     bool retValue;
     string Application = Environment.GetEnvironmentVariable("windir") + @"\Notepad.exe";
     string CommandLine = @" c:\boot.ini";
     PROCESS_INFORMATION pInfo = new PROCESS_INFORMATION();
     STARTUPINFO sInfo = new STARTUPINFO();
     SECURITY_ATTRIBUTES pSec = new SECURITY_ATTRIBUTES();
     SECURITY_ATTRIBUTES tSec = new SECURITY_ATTRIBUTES();
     pSec.nLength = Marshal.SizeOf(pSec);
     tSec.nLength = Marshal.SizeOf(tSec);

     //Open Notepad
     retValue = CreateProcess(Application,CommandLine,
     ref pSec,ref tSec,false,NORMAL_PRIORITY_CLASS,
     IntPtr.Zero,null,ref sInfo,out pInfo);

     Console.WriteLine("Process ID (PID): " + pInfo.dwProcessId);
     Console.WriteLine("Process Handle : " + pInfo.hProcess);
}

Sample Code VB:

Public Shared Sub StartupNotepad()
      Const NORMAL_PRIORITY_CLASS AS UInt32 = &h2

     Dim retValue As Boolean
     Dim Application As String = Environment.GetEnvironmentVariable("windir") & "\Notepad.exe"
     Dim CommandLine As String = " c:\boot.ini"
     Dim pInfo As PROCESS_INFORMATION = New PROCESS_INFORMATION()
     Dim sInfo As STARTUPINFO = New STARTUPINFO()
     Dim pSec As SECURITY_ATTRIBUTES  = New SECURITY_ATTRIBUTES()
     Dim tSec As SECURITY_ATTRIBUTES = New SECURITY_ATTRIBUTES()
     pSec.nLength = Marshal.SizeOf(pSec)
     tSec.nLength = Marshal.SizeOf(tSec)

     //Open Notepad
     retValue = CreateProcess(Application,CommandLine, _
     ref pSec,ref tSec,false,NORMAL_PRIORITY_CLASS, _
     IntPtr.Zero,null,ref sInfo,out pInfo)

     Console.WriteLine("Process ID (PID): " + pInfo.dwProcessId)
     Console.WriteLine("Process Handle : " + pInfo.hProcess)
End Sub

Alternative Managed API:

System.Diagnostics.Process.Start

Further Reading

If the approach outlined above does not work verbatim, try the variation by Thottam R. Sriram: http://blogs.msdn.com/thottams/archive/2006/08/11/696013.aspx

Documentation