In this example we will use the Compact
Framework to create a program containing a launch pad for the Pocket PC. Our
program will provide an integrated interface to launch some of the common
programs on the Pocket PC. This sample serves to demonstrate the use of the
Pinvoke mechanism on the Pocket PC to launch external programs such as Internet
Explorer and Calculator. This example can be extended to create a convenient
toolbox for launching frequently used Pocket PC programs.
The Compact Framework does not have complete support for COM Interop and
interoperating with ActiveX controls. It provides the Platform Invoke mechanism
for calling unmanaged DLLs. We will explore this functionality more in detail in
this example.
The complete code listing along with sample screenshots follow.
The core of our example consists of using C# 's DLLImport attribute to access
the "CreateProcess" function from the unmanaged DLL coredll.dll. This function
is invoked in the program to launch the program as specified in the parameters.
Figure: Launchpad Application in Action
Figure: PocketPc.com site opened from the LaunchPad program through a single
button click
Complete Code Listing
- Imports System
- Imports System.Drawing
- Imports System.Collections
- Imports System.Windows.Forms
- Imports System.Data
- Imports System.Runtime.InteropServices
- Public Class Form1
- Inherits System.Windows.Forms.Form
- Private button1 As System.Windows.Forms.Button
- Private button3 As System.Windows.Forms.Button
- Private button2 As System.Windows.Forms.Button
- Private button4 As System.Windows.Forms.Button
- Private button5 As System.Windows.Forms.Button
- Private mainMenu1 As System.Windows.Forms.MainMenu
- #Region " Windows Form Designer generated code "
- Public Sub New()
- MyBase.New()
-
- InitializeComponent()
-
- End Sub
-
- Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
- MyBase.Dispose(disposing)
- End Sub
-
-
-
- Private Sub InitializeComponent()
- Me.mainMenu1 = New System.Windows.Forms.MainMenu
- Me.button1 = New System.Windows.Forms.Button
- Me.button3 = New System.Windows.Forms.Button
- Me.button2 = New System.Windows.Forms.Button
- Me.button4 = New System.Windows.Forms.Button
- Me.button5 = New System.Windows.Forms.Button
-
- Me.button1.Location = New System.Drawing.Point(40, 16)
- Me.button1.Size = New System.Drawing.Size(96, 32)
- Me.button1.Text = "PocketPc.Com"
- AddHandler button1.Click, AddressOf button1_Click
-
- Me.button3.Location = New System.Drawing.Point(40, 64)
- Me.button3.Size = New System.Drawing.Size(96, 32)
- Me.button3.Text = "IE"
- AddHandler button3.Click, AddressOf button3_Click
-
- Me.button2.Location = New System.Drawing.Point(40, 112)
- Me.button2.Size = New System.Drawing.Size(96, 32)
- Me.button2.Text = "Calculator"
- AddHandler button2.Click, AddressOf button2_Click
-
- Me.button4.Location = New System.Drawing.Point(40, 160)
- Me.button4.Size = New System.Drawing.Size(96, 32)
- Me.button4.Text = "Calendar"
- AddHandler button4.Click, AddressOf button4_Click
-
- Me.button5.Location = New System.Drawing.Point(40, 208)
- Me.button5.Size = New System.Drawing.Size(96, 32)
- Me.button5.Text = "Tasks"
- AddHandler button5.Click, AddressOf button5_Click
-
- Me.Controls.Add(Me.button5)
- Me.Controls.Add(Me.button4)
- Me.Controls.Add(Me.button2)
- Me.Controls.Add(Me.button3)
- Me.Controls.Add(Me.button1)
- Me.Menu = Me.mainMenu1
- Me.Text = "Form1"
- End Sub
- Shared Sub Main()
- Application.Run(New Form1)
- End Sub
- #End Region
- Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
- ShowPPCWebSite()
- End Sub
- Private Sub button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
- StartCalc()
- End Sub
- Private Sub button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
- StartIE()
- End Sub
- Private Sub button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
- StartCalendar()
- End Sub
- Private Sub button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
- StartTasks()
- End Sub
- Private Declare Function CreateProcess Lib "coredll.Dll" (ByVal strImageName As String, ByVal strCmdLine As String, ByVal pProcessAttributes As IntPtr, ByVal pThreadAttributes As IntPtr, ByVal bInheritsHandle As Integer, ByVal dwCreationFlags As Integer, ByVal pEnvironment As IntPtr, ByVal pCurrentDir As IntPtr, ByVal bArray() As [Byte], ByVal oProc As ProcessInfo) As Integer
- Private Sub ShowPPCWebSite()
- Dim pi As New ProcessInfo
- CreateProcess("iexplore.exe", "www.microsoft.com/mobile/pocketpc/default.asp", IntPtr.Zero, IntPtr.Zero, 0, 0, IntPtr.Zero, IntPtr.Zero, New [Byte](128) {}, pi)
- End Sub
- Private Sub StartIE()
- Dim pi As New ProcessInfo
- CreateProcess("iexplore.exe", "", IntPtr.Zero, IntPtr.Zero, 0, 0, IntPtr.Zero, IntPtr.Zero, New [Byte](128) {}, pi)
- End Sub
- Private Sub StartCalc()
- Dim pi As New ProcessInfo
- CreateProcess("calc.exe", "", IntPtr.Zero, IntPtr.Zero, 0, 0, IntPtr.Zero, IntPtr.Zero, New [Byte](128) {}, pi)
- End Sub
- Private Sub StartCalendar()
- Dim pi As New ProcessInfo
- CreateProcess("calendar.exe", "", IntPtr.Zero, IntPtr.Zero, 0, 0, IntPtr.Zero, IntPtr.Zero, New [Byte](128) {}, pi)
- End Sub
- Private Sub StartTasks()
- Dim pi As New ProcessInfo
- CreateProcess("tasks.exe", "", IntPtr.Zero, IntPtr.Zero, 0, 0, IntPtr.Zero, IntPtr.Zero, New [Byte](128) {}, pi)
- End Sub
- End Class
- Public Class ProcessInfo
- Public Process As Integer
- Public Thread As Integer
- Public ProcessID As Integer
- Public ThreadID As Integer
- End Class
NOTE
This article is purely for demonstration. This article should not be construed
as a best practices white paper. This article is entirely original, unless
specified. Any resemblance to other material is an un-intentional coincidence
and should not be misconstrued as malicious, slanderous, or any anything else
hereof.
Conclusion
In this article, we explored the code to launch external applications on Pocket
PC using Pinvoke and unmanaged DLLs. I would like to give credit to Scott
Swigart for his valuable inputs on support newsgroups.