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


Utilisation de ShellExecute pour lancer un programme eVB
 
   



Une question classique

Une question revient souvent sur les forums de CodePPC : "Comment faire pour que mon programme développé avec eVB ait sa propre icône et non l'icône du runtime ?"

La réponse est en soit assez simple, il faut créer un programme en eVC++ qui soit capable de lancer tout seul le programme eVB. Dans la pratique, si on a pas trop l'habitude ça risque d'être un peu plus compliqué.

La fonction miracle

Le besoin est simple. Il faut que ce programme .exe (qui a donc sa propre icône) soit capable de lancer un .vb qui se trouve dans le même dossier que lui. Pour cela nous allons devoir effectuer un petit traitement de chaine et utiliser une fonction qui soit capable de lancer la bonne application (en ce qui nous concerne le runtime eVB) à partir d'un nom de document (notre .vb).

Il existe une API qui est capable de lancer le bon programme à partir du nom du document, c'est ShellExecute.

Le code de la fonction ExecuteApp

Le mieux est de créer une fonction qui prend en paramètre le nom du .vb à lancer. Son code doit globalement ressembler à ça :

void ExecuteApp(TCHAR *AppName)
{
   SHELLEXECUTEINFO sei;
   TCHAR AppPath[MAX_PATH];
   TCHAR *Pos1;              


   //On récupère le chemin complet du launcher
  GetModuleFileName(NULL, AppPath, MAX_PATH);
  //On recherche le dernier \ et on le remplace
  //par \0 de fin de chaine
  Pos1 = wcsrchr(AppPath, (unsigned short &)TEXT("\\"));
  *Pos1 = (unsigned short &)TEXT("\0");
   //On ajoute le nom du fichier vb à lancer
   wcscat(AppPath, AppName);

   //On prépare la structure pour le ShellExecute
   memset(&sei, 0, sizeof(sei));
   sei.cbSize = sizeof(sei);
   sei.hwnd= NULL;
   sei.lpVerb = TEXT("open");
   sei.lpParameters = NULL;
   sei.lpFile = AppPath;
   sei.nShow = SW_SHOWNORMAL;
   //On lance le ShellExecute
   ShellExecuteEx(&sei);
}

Cette fonction "ExecuteApp" est très simple. Pour commencer on récupère le chemin complet du programme .exe qui tourne (notre lanceur).

Un traitement sur cette chaine (attention UNICODE) est effectué pour récupérer tout le chemin sans le nom du programme (ex "\Windows\Toto.exe" devient "\Window").

Pour terminer, on crée à partir de ce chemin et du paramètre passé à la fonction le chemin final à exécuter ("\Window" et "\Essai.vb" deviennent "\Windows\Essai.vb") qui est ensuite passé à la fonction "ShellExecute". Là, le runtime eVB est lancé avec comme paramètre de travail le fichier .vb demandé.

Créer un .exe de lancement

Il est bien important de comprendre qu'à chaque programme .vb auquel vous voulez associer un lanceur, vous devrez modifier les sources de ce même lanceur pour qu'il intègre la bonne icône et le bon nom de fichier .vb à lancer.

Pour celà, le plus simple est de vous créer un squelette de lanceur que vous utiliserez à chaque fois en modifier uniquement l'icône et l'appel à la fonction de lancement.

Dans votre programme eVC++ il vous suffit alors, dans la fonction WinMain (qui est le point d'entrée des programmes Windows) de lancer la fonction d'exécution et de quitter immédiatement après. Si par exemple vous voulez lancer "MonProgramme.vb" vous pouvez écrire :

int WINAPI WinMain( HINSTANCE hInstance,
  HINSTANCE hPrevInstance,
  LPTSTR lpCmdLine,
  int nCmdShow)
{
   ExecuteApp(TEXT("\\MonProgramme.vb"));
   return 0;
}             

Il ne vous reste plus qu'à renommer le .exe avec le nom qui convient (ici MonProgramme.exe) et de le placer à coté du .vb à lancer pour que l'icône soit disponible.

Pour ce qui est de la création du programme d'installation, il faut là aussi effectuer quelques manipulations pour intégrer le lanceur à l'install et pour faire en sorte qu'il devienne le programme qui doit être utilisé comme référence. Mais ça, ça fera l'objet d'un autre article, si ça vous intéresse bien sûr...

Si vous rencontrez des problèmes concernant cet article, n'hésitez pas à poser vos questions sur les forums "eVC++" ou "Articles eVC++" de CodePPC.

Stéphane Sibué

 

 

       
   
 
   
Copyright 2001-2004 - Tous droits réservés
 
   

iPAQ est un produit de COMPAQ.
Visual Tools est un produit de Microsoft Corporation.
Toutes les autres marques et produits présents dans ces pages sont la propriété exclusive de leurs sociétés respectives.