Partager via


Lancement d’applications (ShellExecute, ShellExecuteEx, SHELLEXECUTEINFO)

Une fois que votre application a localisé un objet de fichier, l’étape suivante consiste souvent à agir dessus d’une certaine manière. Par exemple, 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, et un verb 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 de fichiers et de dossiers peuvent faire partie du système de fichiers ou des objets virtuels, et ils peuvent être identifiés par des chemins 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 rechercher quels verbes sont disponibles, consultez les registres dans la section de

HKEY_CLASSES_ROOT\CLSID\{object_clsid}\Shell\verb

object_clsid est l’identificateur de classe (CLSID) de l’objet, et verb est le nom de l’objet disponible verb. La verb\sous-clé de commande contient les données indiquant ce qui se passe quand celle-là verb est appelée.

Pour savoir quels verbes sont disponibles pour les objets prédéfinisShell, recherchez dans le Registre sous

\ HKEY_CLASSES_ROOTobject_name\shell\verb

object_name est le nom de l’objet prédéfini Shell . Encore une fois, la sous-clé verb\de commande contient les données indiquant ce qui se passe lorsque verb est invoqué.

Les verbes couramment disponibles sont les suivants :

Verb Descriptif
edit Lance un éditeur et ouvre le document pour modification.
find Lance une recherche à partir du répertoire spécifié.
open 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 entrer les informations d’identification d’un compte d’administrateur utilisé pour exécuter l’application.

Chacun verb correspond à la commande qui serait utilisée pour lancer l’application à partir d’une fenêtre de console. Le openverb constitue un bon exemple, car il est généralement pris en charge. Pour les fichiers .exe, open lance simplement l’application. Toutefois, il est plus couramment utilisé pour lancer une application qui fonctionne sur un fichier particulier. Par exemple, .txt fichiers peuvent être ouverts par Microsoft WordPad. Pour openverb un fichier .txt correspondrait donc à quelque chose comme 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 si nécessaire pour lancer l’application correctement. Pour plus d’informations sur les menus contextuels et les verbes, consultez Extension des menus contextuels.

En règle générale, la tentative de déterminer la liste des verbes disponibles pour un fichier particulier est quelque peu compliquée. Dans de nombreux cas, vous pouvez simplement définir le paramètre lpVerb sur NULL, 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 la documentation de référence sur l’extension des menus contextuels et 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 sites à ShellExecuteEx afin d'activer ces comportements. Pour fournir le site à ShellExecuteEx :

Utilisation de ShellExecute pour lancer la boîte de dialogue De recherche

Lorsqu’un utilisateur clique avec le bouton droit sur une icône de dossier dans l’Explorateur Windows, l’un des éléments de menu est « Rechercher ». S'ils sélectionnent cet élément, le Shell lance son utilitaire de recherche. Cet utilitaire affiche une boîte de dialogue qui peut être utilisée pour rechercher des fichiers pour une chaîne de texte spécifiée. Une application peut lancer par programmation l’utilitaire de recherche pour un répertoire en appelant ShellExecute, avec «find » comme paramètre lpVerb et le chemin d’accès au répertoire en tant que paramètre lpFile . Par exemple, 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 code PIDL du répertoire Windows et énumère son contenu jusqu’à ce qu’il 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 complet. Étant donné qu’il s’agit d’un dossier de système de fichiers, le nom d’analyse est un chemin 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 « ouverte ». La structure est ensuite passée à ShellExecuteEx, qui lance le gestionnaire par défaut pour les fichiers bitmap, généralement MSPaint.exe, au open fichier. Une fois la fonction retournée, les FICHIERS PIDL sont libérés et l’interface IShellFolder du dossier Windows est publiée.