Le premier site francophone dédié au développement Pocket PC

c2iBubbles, un petit jeu en VB.NET
Auteur
Richard Clark
Date 15 Janvier 2003
 
   


Petite note de

Cet article est aussi disponible sur l'excellent site c2i.fr de notre ami Richard Clark, l'un des grands spécialistes français de .NET

On y va....

Il peut être pratique dans une quelconque application pour Pocket PC de pouvoir lancer une autre application comme Internet Explorer & Co. Avec le .NET Framework (pour Windows), c'est relativement simple puisqu'il existe une classe qui fait cela pour vous : System.Diagnostics.Process.

Malheureusement, ce type n'existe pas dans le Compact Framework. Il va donc falloir faire appel aux API de WinCE pour cela, et plus particulièrement CreateProcess.

Je me suis donc plongé dans la documentation sur MSDN et j'ai lu l'article sur ce sujet sur ce sujet sur CodePPC.com pour eVB. L'approche est similaire mais j'ai voulu l'améliorer un tout petit peu (désolé Stéphane ;-)))

J'ai donc créé un nouveau projet Pocket PC et j'ai ajouté une nouvelle classe Process que j'ai placée dans l'espace de noms c2i.Diagnostics et une autre, toujours dans le même espace de noms, ProcessInfo :

Imports System.Runtime.InteropServices

Namespace Diagnostic
    Public Class Process
        '...
    End Class

     <StructLayout(LayoutKind.Sequential)>Public Class ProcessInfo
          Public hProcess As Int32
          Public hThread As Int32
          Public ProcessID As Int32
          Public ThreadID As Int32
     End Class
End Namespace

Cette dernière classe nous retournera des informations sur le nouveau Process crée  ainsi que sur le Thread créé. Remarquez l'attribut StructLayout appliqué à cette classe. Elle indique au Framework qu'il doit placer en mémoire de façon contigüe les propriétés de ProcessInfo (sinon il peut les placer comme il veut, un peu partout dans l'adressage mémoire).

A l'intérieur de Process, il va falloir déclarer l'API CreateProcess :

Private Declare Function CreateProcess Lib "coredll" Alias "CreateProcessW" ( _
       ByVal lpApplicationName As String, _
       ByVal lpCommandLine As String, _
       ByVal lpProcessAttributes As IntPtr, _
       ByVal lpThreadAttribute As IntPtr, _
       ByVal bInheritHandles As Boolean, _ 
       ByVal dwCreationFlags As Int32, _
       ByVal lpEnvironment As IntPtr, _ 
       ByVal lpCurrentDirectory As IntPtr, _
       ByVal lpStatupInfo As IntPtr, _
       ByVal lpProcessInformation As ProcessInfo) As Int32

Le premier argument est le nom du fichier de l'application que l'on souhaite lancer.
Le deuxième est un String contenant les arguments de la ligne de commande (l'URL du site pour Internet Explorer par exemple).
Les trois suivants ne servent à rien (not supported comme ils disent). Remarquez tout de même que ce sont des pointeurs donc de type System.IntPtr.
dwCreationFlags pourrait définir des informations supplémentaire pour le lancement du Process comme par exemple le mode de déboguage, si le process appelant est gelé ou non, etc. Ici, on ne s'en préoccupera pas.
Les trois suivants ne sont toujours pas supportés et le dernier, enfin, et une référence vers le ProcessInfo. Vous saurez ainsi le numéro, et l'ID du Process et du Thread.

Pour appeler cette API, j'ai décidé de créer une fonction partagée (Shared) qui en facilite son utilisation :

Public Shared Function LaunchAppli(ByVal sName As String, ByVal sArgs As String) As ProcessInfo
      Dim oPI As New ProcessInfo 
            Try 
                  Dim iResult As Int32 = CreateProcess(sName, sArgs, _
                                                System.IntPtr.Zero, IntPtr.Zero, False, 0, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, oPI)
                  If iResult = 0 Then Throw New System.Runtime.InteropServices.ExternalException("Appel incorrect") 
                  Return oPI
           Catch ex As Exception
                  Throw 'relance la même exception
           Catch
                  Throw New Exception("Unmanaged exception, turn off your application please") 
           End Try 
End Function

Et voila, dans votre application, il n'y a plus qu'une seule ligne à écrire :

'pour le calendrier
Dim oPI As c2i.Diagnostic.ProcessInfo = c2i.Diagnostic.Process.LaunchAppli("calendar.exe, String.Empty)
'pour Internet Explorer
Dim oPI As c2i.Diagnostic.ProcessInfo = c2i.Diagnostic.Process.LaunchAppli("iexplore.exe", "http://www.c2i.fr/pda")

Facile non ?

NB : J'avais écris cet article quand en me baladant sur Internet, je suis tombé sur une article de même nature sur dotnetforce.com paru au même moment. Vous pouvez aller le consulter, il est légèrement différent puisqu'il est en C#.

 

 


Richard Clark

 

 
   

Copyright 2001-2004 - Tous droits réservés
Toutes les autres marques et produits présents dans ces pages sont la propriété exclusive de leurs sociétés respectives.