Freigeben über


Starten von Anwendungen (ShellExecute, ShellExecuteEx, SHELLEXECUTEINFO)

Sobald Ihre Anwendung ein Dateiobjekt gefunden hat, besteht der nächste Schritt häufig darin, in irgendeiner Weise darauf zu reagieren. Für instance möchte Ihre Anwendung möglicherweise eine andere Anwendung starten, die es dem Benutzer ermöglicht, eine Datendatei zu ändern. Wenn es sich bei der interessanten Datei um eine ausführbare Datei handelt, möchte Ihre Anwendung sie möglicherweise einfach starten. In diesem Dokument wird erläutert, wie Sie ShellExecute oder ShellExecuteEx verwenden, um diese Aufgaben auszuführen.

Verwenden von ShellExecute und ShellExecuteEx

Um ShellExecute oder ShellExecuteEx zu verwenden, muss Ihre Anwendung das Datei- oder Ordnerobjekt angeben, auf das gehandelt werden soll, und ein Verb , das den Vorgang angibt. Weisen Sie für ShellExecute diese Werte den entsprechenden Parametern zu. Geben Sie für ShellExecuteEx die entsprechenden Member einer SHELLEXECUTEINFO-Struktur ein. Es gibt auch mehrere andere Member oder Parameter, die verwendet werden können, um das Verhalten der beiden Funktionen zu optimieren.

Datei- und Ordnerobjekte können Teil des Dateisystems oder virtueller Objekte sein, und sie können entweder durch Pfade oder Zeiger auf Elementbezeichnerlisten (ITEM Identifier Lists, PIDLs) identifiziert werden.

Objektverben

Die für ein Objekt verfügbaren Verben sind im Wesentlichen die Elemente, die Sie im Kontextmenü eines Objekts finden. Um zu ermitteln, welche Verben verfügbar sind, suchen Sie in der Registrierung unter

HKEY_CLASSES_ROOT\CLSID\{object_clsid}\Muschel\Verb

wobei object_clsid der Klassenbezeichner (CLSID) des -Objekts und das Verb der Name des verfügbaren Verbs ist. DerVerbbefehlsunterschlüssel\ enthält die Daten, die angeben, was geschieht, wenn dieses Verb aufgerufen wird.

Um herauszufinden, welche Verben für vordefinierte Shell-Objekte verfügbar sind, suchen Sie in der Registrierung unter

HKEY_CLASSES_ROOT\Object_name\Muschel\Verb

wobei object_name der Name des vordefinierten Shell-Objekts ist. Auch hier enthält der UnterschlüsseldesVerbbefehls\ die Daten, die angeben, was geschieht, wenn dieses Verb aufgerufen wird.

Häufig verfügbare Verben sind:

Verb BESCHREIBUNG
Bearbeiten Startet einen Editor und öffnet das Dokument zur Bearbeitung.
Suchen Initiiert eine Suche ab dem angegebenen Verzeichnis.
open Startet eine Anwendung. Wenn es sich bei dieser Datei nicht um eine ausführbare Datei handelt, wird die zugehörige Anwendung gestartet.
print Gibt die Dokumentdatei aus.
properties Zeigt die Eigenschaften des Objekts an.
RunAs Startet eine Anwendung als Administrator. Die Benutzerkontensteuerung (User Account Control, UAC) fordert den Benutzer zur Zustimmung auf, die Anwendung mit erhöhten Rechten auszuführen oder die Anmeldeinformationen eines Administratorkontos einzugeben, das zum Ausführen der Anwendung verwendet wird.

Jedes Verb entspricht dem Befehl, der zum Starten der Anwendung über ein Konsolenfenster verwendet wird. Das offene Verb ist ein gutes Beispiel, da es häufig unterstützt wird. Öffnen Sie für .exe Dateien einfach die Anwendung. Es wird jedoch häufiger verwendet, um eine Anwendung zu starten, die mit einer bestimmten Datei arbeitet. Für instance können .txt Dateien von Microsoft WordPad geöffnet werden. Das offene Verb für eine .txt-Datei würde also etwa dem folgenden Befehl entsprechen:

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

Wenn Sie shellExecute oder ShellExecuteEx zum Öffnen einer .txt-Datei verwenden, wird Wordpad.exe mit der angegebenen Datei als Argument gestartet. Einige Befehle können zusätzliche Argumente enthalten, z. B. Flags, die nach Bedarf hinzugefügt werden können, um die Anwendung ordnungsgemäß zu starten. Weitere Informationen zu Kontextmenüs und Verben finden Sie unter Erweitern von Kontextmenüs.

Im Allgemeinen ist der Versuch, die Liste der verfügbaren Verben für eine bestimmte Datei zu ermitteln, etwas kompliziert. In vielen Fällen können Sie einfach den lpVerb-Parameter auf NULL festlegen, wodurch der Standardbefehl für den Dateityp aufgerufen wird. Diese Prozedur entspricht normalerweise dem Festlegen von lpVerb auf "open", aber einige Dateitypen verfügen möglicherweise über einen anderen Standardbefehl. Weitere Informationen finden Sie unter Erweitern von Kontextmenüs und in der ShellExecuteEx-Referenzdokumentation .

Verwenden von ShellExecuteEx zum Bereitstellen von Aktivierungsdiensten von einem Standort aus

Die Dienste einer Websitekette können viele Verhaltensweisen der Elementaktivierung steuern. Ab Windows 8 können Sie einen Zeiger auf die Standortkette auf ShellExecuteEx bereitstellen, um diese Verhaltensweisen zu aktivieren. So stellen Sie die Website für ShellExecuteEx bereit:

Verwenden von ShellExecute zum Starten des Suchdialogfelds

Wenn ein Benutzer mit der rechten Maustaste auf ein Ordnersymbol in Windows Explorer klickt, ist eines der Menüelemente "Suchen". Wenn sie dieses Element auswählen, startet die Shell ihr Suchhilfsprogramm. Dieses Hilfsprogramm zeigt ein Dialogfeld an, mit dem Dateien nach einer angegebenen Textzeichenfolge gesucht werden können. Eine Anwendung kann das Suchhilfsprogramm für ein Verzeichnis programmgesteuert starten, indem ShellExecute mit "find" als lpVerb-Parameter und dem Verzeichnispfad als lpFile-Parameter aufgerufen wird. Für instance startet die folgende Codezeile das Hilfsprogramm Search für das Verzeichnis c:\MyPrograms.

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

Ein einfaches Beispiel für die Verwendung von ShellExecuteEx

Die folgende Beispielkonsolenanwendung veranschaulicht die Verwendung von ShellExecuteEx. Der meiste Fehlerüberprüfungscode wurde aus Gründen der Übersichtlichkeit weggelassen.

#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;
}

Die Anwendung ruft zuerst die PIDL des Windows-Verzeichnisses ab und listet den Inhalt auf, bis sie die erste .bmp Datei findet. Im Gegensatz zum vorherigen Beispiel wird IShellFolder::GetDisplayNameOf verwendet, um den Analysenamen der Datei anstelle des Anzeigenamens abzurufen. Da es sich um einen Dateisystemordner handelt, ist der Analysename ein vollqualifizierter Pfad, der für ShellExecuteEx benötigt wird.

Sobald die erste .bmp Datei gefunden wurde, werden den Membern einer SHELLEXECUTEINFO-Struktur entsprechende Werte zugewiesen. Das lpFile-Element wird auf den Analysenamen der Datei und das lpVerb-Element auf NULL festgelegt, um den Standardvorgang zu starten. In diesem Fall ist der Standardvorgang "open". Die Struktur wird dann an ShellExecuteEx übergeben, wodurch der Standardhandler für Bitmapdateien gestartet wird, in der Regel MSPaint.exe, um die Datei zu öffnen. Nachdem die Funktion zurückgegeben wurde, werden die PIDLs freigegeben, und die IShellFolder-Schnittstelle des Windows-Ordners wird freigegeben.