Lancement d’applications (ShellExecute, ShellExecuteEx, SHELLEXECUTEINFO)

Une fois que votre application a localisé un objet de fichier, l’étape suivante consiste souvent à agir sur celui-ci d’une manière ou d’une autre. Par instance, votre application peut souhaiter lancer une autre application qui permet à l’utilisateur de modifier un fichier de données. Si le fichier d’intérêt est un exécutable, votre application peut simplement le lancer. Ce document explique comment utiliser ShellExecute ou ShellExecuteEx pour effectuer ces tâches.

Utilisation de ShellExecute et ShellExecuteEx

Pour utiliser ShellExecute ou ShellExecuteEx, votre application doit spécifier l’objet fichier ou dossier sur lequel agir, ainsi qu’un verbe qui spécifie l’opération. Pour ShellExecute, affectez ces valeurs aux paramètres appropriés. Pour ShellExecuteEx, renseignez les membres appropriés d’une structure SHELLEXECUTEINFO . Il existe également plusieurs autres membres ou paramètres qui peuvent être utilisés pour affiner le comportement des deux fonctions.

Les objets fichier et dossier peuvent faire partie du système de fichiers ou des objets virtuels, et ils peuvent être identifiés par des chemins d’accès ou des pointeurs vers des listes d’identificateurs d’élément (PIDL).

Verbes d’objet

Les verbes disponibles pour un objet sont essentiellement les éléments que vous trouvez dans le menu contextuel d’un objet. Pour trouver les verbes disponibles, regardez dans le Registre sous

\ HKEY_CLASSES_ROOT CLSID\{object_clsid}\Shell\Verbe

object_clsid est l’identificateur de classe (CLSID) de l’objet, et verb est le nom du verbe disponible. La sous-cléde commandeverb\ contient les données qui indiquent ce qui se passe lorsque ce verbe est appelé.

Pour savoir quels verbes sont disponibles pour les objets Shell prédéfinis, regardez dans le Registre sous

\ HKEY_CLASSES_ROOT Object_name\Shell\Verbe

object_name est le nom de l’objet Shell prédéfini. Là encore, la\ sous-cléde commande verbe contient les données qui indiquent ce qui se passe lorsque ce verbe est appelé.

Les verbes couramment disponibles sont les suivants :

Verbe Description
modifier Lance un éditeur et ouvre le document pour modification.
trouver Lance une recherche à partir du répertoire spécifié.
ouvrir Lance une application. Si ce fichier n’est pas un fichier exécutable, son application associée est lancée.
print Imprime le fichier de document.
properties Affiche les propriétés de l’objet.
runas Lance une application en tant qu’administrateur. Le contrôle de compte d’utilisateur (UAC) invite l’utilisateur à donner son consentement pour exécuter l’application avec élévation de privilèges ou entre les informations d’identification d’un compte d’administrateur utilisé pour exécuter l’application.

Chaque verbe correspond à la commande qui serait utilisée pour lancer l’application à partir d’une fenêtre de console. Le verbe ouvert est un bon exemple, car il est couramment pris en charge. Pour .exe fichiers, ouvrir lance simplement l’application. Toutefois, il est plus couramment utilisé pour lancer une application qui fonctionne sur un fichier particulier. Pour instance, .txt fichiers peuvent être ouverts par Microsoft WordPad. Le verbe ouvert d’un fichier .txt correspond donc à une commande similaire à la commande suivante :

"C:\Program Files\Windows NT\Accessories\Wordpad.exe" "%1"

Lorsque vous utilisez ShellExecute ou ShellExecuteEx pour ouvrir un fichier .txt, Wordpad.exe est lancé avec le fichier spécifié comme argument. Certaines commandes peuvent avoir des arguments supplémentaires, tels que des indicateurs, qui peuvent être ajoutés en fonction des besoins pour lancer l’application correctement. Pour plus d’informations sur les menus contextuels et les verbes, consultez Extension des menus contextuels.

En général, essayer de déterminer la liste des verbes disponibles pour un fichier particulier est quelque peu compliqué. Dans de nombreux cas, vous pouvez simplement définir le paramètre lpVerb sur NULL, ce qui appelle la commande par défaut pour le type de fichier. Cette procédure équivaut généralement à définir lpVerb sur « open », mais certains types de fichiers peuvent avoir une commande par défaut différente. Pour plus d’informations, consultez Extension des menus contextuels et la documentation de référence ShellExecuteEx .

Utilisation de ShellExecuteEx pour fournir des services d’activation à partir d’un site

Les services d’une chaîne de site peuvent contrôler de nombreux comportements d’activation d’élément. À partir de Windows 8, vous pouvez fournir un pointeur vers la chaîne de site vers ShellExecuteEx pour activer ces comportements. Pour fournir le site à ShellExecuteEx :

Utilisation de ShellExecute pour lancer la boîte de dialogue Rechercher

Lorsqu’un utilisateur clique avec le bouton droit sur une icône de dossier dans Windows Explorer, l’un des éléments de menu est « Rechercher ». S’ils sélectionnent cet élément, l’interpréteur de commandes lance son utilitaire de recherche. Cet utilitaire affiche une boîte de dialogue qui peut être utilisée pour rechercher une chaîne de texte spécifiée dans les fichiers. Une application peut lancer par programmation l’utilitaire de recherche d’un répertoire en appelant ShellExecute, avec « find » comme paramètre lpVerb et le chemin d’accès au répertoire comme paramètre lpFile . Par instance, la ligne de code suivante lance l’utilitaire de recherche pour le répertoire c:\MyPrograms.

ShellExecute(hwnd, "find", "c:\\MyPrograms", NULL, NULL, 0);

Exemple simple d’utilisation de ShellExecuteEx

L’exemple d’application console suivant illustre l’utilisation de ShellExecuteEx. La plupart du code de vérification des erreurs a été omis pour plus de clarté.

#include <shlobj.h>
#include <shlwapi.h>
#include <objbase.h>

main()
{
    LPITEMIDLIST pidlWinFiles = NULL;
    LPITEMIDLIST pidlItems = NULL;
    IShellFolder *psfWinFiles = NULL;
    IShellFolder *psfDeskTop = NULL;
    LPENUMIDLIST ppenum = NULL;
    STRRET strDispName;
    TCHAR pszParseName[MAX_PATH];
    ULONG celtFetched;
    SHELLEXECUTEINFO ShExecInfo;
    HRESULT hr;
    BOOL fBitmap = FALSE;

    hr = SHGetFolderLocation(NULL, CSIDL_WINDOWS, NULL, NULL, &pidlWinFiles);

    hr = SHGetDesktopFolder(&psfDeskTop);

    hr = psfDeskTop->BindToObject(pidlWinFiles, NULL, IID_IShellFolder, (LPVOID *) &psfWinFiles);
    hr = psfDeskTop->Release();

    hr = psfWinFiles->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum);

    while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
    {
        psfWinFiles->GetDisplayNameOf(pidlItems, SHGDN_FORPARSING, &strDispName);
        StrRetToBuf(&strDispName, pidlItems, pszParseName, MAX_PATH);
        CoTaskMemFree(pidlItems);
        if(StrCmpI(PathFindExtension(pszParseName), TEXT( ".bmp")) == 0)
        {
            fBitmap = TRUE;
            break;
        }
    }

    ppenum->Release();

    if(fBitmap)
    {
        ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
        ShExecInfo.fMask = NULL;
        ShExecInfo.hwnd = NULL;
        ShExecInfo.lpVerb = NULL;
        ShExecInfo.lpFile = pszParseName;
        ShExecInfo.lpParameters = NULL;
        ShExecInfo.lpDirectory = NULL;
        ShExecInfo.nShow = SW_MAXIMIZE;
        ShExecInfo.hInstApp = NULL;

        ShellExecuteEx(&ShExecInfo);
    }

    CoTaskMemFree(pidlWinFiles);
    psfWinFiles->Release();

    return 0;
}

L’application récupère d’abord le FICHIER PIDL du répertoire Windows et énumère son contenu jusqu’à ce qu’elle trouve le premier fichier .bmp. Contrairement à l’exemple précédent, IShellFolder::GetDisplayNameOf est utilisé pour récupérer le nom d’analyse du fichier au lieu de son nom d’affichage. Étant donné qu’il s’agit d’un dossier de système de fichiers, le nom de l’analyse est un chemin d’accès complet, ce qui est nécessaire pour ShellExecuteEx.

Une fois le premier fichier .bmp localisé, les valeurs appropriées sont affectées aux membres d’une structure SHELLEXECUTEINFO . Le membre lpFile est défini sur le nom d’analyse du fichier et le membre lpVerb sur NULL pour commencer l’opération par défaut. Dans ce cas, l’opération par défaut est « open ». La structure est ensuite passée à ShellExecuteEx, qui lance le gestionnaire par défaut pour les fichiers bitmap, généralement MSPaint.exe, pour ouvrir le fichier. Une fois la fonction retournée, les FICHIERS PIDL sont libérés et l’interface IShellFolder du dossier Windows est libérée.