Invoking Unmanaged DLL Functions from Compact Framework for Pocket PC


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

using System;
using System.Drawing;
using System.Collections;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;
namespace SDE_IE
{
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button3;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Button button4;
private System.Windows.Forms.Button button5;
private System.Windows.Forms.MainMenu mainMenu1;
public Form1()
{
InitializeComponent();
}
protected override void Dispose( bool disposing )
{
base.Dispose( disposing );
}
#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
this.mainMenu1 = new System.Windows.Forms.MainMenu();
this.button1 = new System.Windows.Forms.Button();
this.button3 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
this.button4 = new System.Windows.Forms.Button();
this.button5 = new System.Windows.Forms.Button();
//
// button1
//
this.button1.Location = new System.Drawing.Point(40, 16);
this.button1.Size = new System.Drawing.Size(96, 32);
this.button1.Text = "PocketPc.Com";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// button2
//
this.button3.Location = new System.Drawing.Point(40, 64);
this.button3.Size = new System.Drawing.Size(96, 32);
this.button3.Text = "IE";
this.button3.Click += new System.EventHandler(this.button3_Click);
//
// button3
//
this.button2.Location = new System.Drawing.Point(40, 112);
this.button2.Size = new System.Drawing.Size(96, 32);
this.button2.Text = "Calculator";
this.button2.Click += new System.EventHandler(this.button2_Click);
//
// button4
//
this.button4.Location = new System.Drawing.Point(40, 160);
this.button4.Size = new System.Drawing.Size(96, 32);
this.button4.Text = "Calendar";
this.button4.Click += new System.EventHandler(this.button4_Click);
//
// button5
//
this.button5.Location = new System.Drawing.Point(40, 208);
this.button5.Size = new System.Drawing.Size(96, 32);
this.button5.Text = "Tasks";
this.button5.Click += new System.EventHandler(this.button5_Click);
//
// Form1
//
this.ClientSize = new System.Drawing.Size(240, 270);
this.Controls.Add(this.button5);
this.Controls.Add(this.button4);
this.Controls.Add(this.button2);
this.Controls.Add(this.button3);
this.Controls.Add(this.button1);
this.Menu = this.mainMenu1;
this.Text = "Form1";
}
#endregion
static void Main()
{
Application.Run(
new Form1());
}
private void button1_Click(object sender, System.EventArgs e)
{
ShowPPCWebSite();
}
private void button2_Click(object sender, System.EventArgs e)
{
StartIE();
}
private void button3_Click(object sender, System.EventArgs e)
{
StartCalc();
}
private void button4_Click(object sender, System.EventArgs e)
{
StartCalendar();
}
private void button5_Click(object sender, System.EventArgs e)
{
StartTasks();
}
[DllImport("coredll.Dll")]
private static extern int CreateProcess(string strImageName, string strCmdLine, IntPtr pProcessAttributes, IntPtr pThreadAttributes , int bInheritsHandle, int
wCreationFlags, IntPtr pEnvironment, IntPtr pCurrentDir, Byte[] bArray, ProcessInfo oProc);
private void ShowPPCWebSite()
{
ProcessInfo pi =
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);
}
private void StartIE( )
{
ProcessInfo pi =
new ProcessInfo();
CreateProcess("iexplore.exe", "", IntPtr.Zero, IntPtr.Zero, 0, 0, IntPtr.Zero,
ntPtr.Zero,
new Byte[128], pi);
}
private void StartCalc()
{
ProcessInfo pi =
new ProcessInfo();
CreateProcess("calc.exe", "", IntPtr.Zero, IntPtr.Zero, 0, 0, IntPtr.Zero,
ntPtr.Zero,
new Byte[128], pi);
}
private void StartCalendar()
{
ProcessInfo pi =
new ProcessInfo();
CreateProcess("calendar.exe", "", IntPtr.Zero, IntPtr.Zero, 0, 0, IntPtr.Zero,
ntPtr.Zero,
new Byte[128], pi);
}
private void StartTasks()
{
ProcessInfo pi =
new ProcessInfo();
CreateProcess("tasks.exe", "", IntPtr.Zero, IntPtr.Zero, 0, 0, IntPtr.Zero,
ntPtr.Zero,
new Byte[128], pi);
}
}
public class ProcessInfo
{
public int Process;
public int Thread;
public int ProcessID;
public int ThreadID;
}
}

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.

Next Recommended Readings