SIGN UP MEMBER LOGIN:    
ARTICLE

Invoking Unmanaged DLL Functions from Compact Framework for Pocket PC

Posted by Dipal Choksi Articles | Compact Framework January 04, 2003
In this example we will use the Compact Framework to create a program containing a launch pad for the Pocket PC.
Reader Level:

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.

Login to add your contents and source code to this article
share this article :
post comment
 

We were using a c++ dll with our web application which was using .net framework 1.0 now .net framework is upgraded to version 2.0 and the dll stopped working and it works fine only if we register it, is there any work around exist so that I do not have to register it? thanks Aditya

Posted by aditya kumar Apr 05, 2009
Team Foundation Server Hosting
Become a Sponsor
PREMIUM SPONSORS
  • The leading .NET charting control now features PDF, Flash and Silverlight export, visualization of large datasets and more. Deliver true charting functionality to your BI, Scorecard, Presentation or Scientific apps. Download evaluation now.
    The leading .NET charting control now features PDF, Flash and Silverlight export, visualization of large datasets and more. Deliver true charting functionality to your BI, Scorecard, Presentation or Scientific apps. Download evaluation now.
Become a Sponsor