Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Sobald ihre Anwendung ein Dateiobjekt gefunden hat, besteht der nächste Schritt häufig darin, auf irgendeine Weise darauf zu reagieren. Ihre Anwendung möchte beispielsweise eine andere Anwendung starten, mit der der Benutzer eine Datendatei ändern kann. Wenn die datei von Interesse eine ausführbare Datei ist, möchte Ihre Anwendung sie möglicherweise einfach starten. In diesem Dokument wird erläutert, wie Sie diese Aufgaben mithilfe von ShellExecute oder ShellExecuteEx ausführen.
- Verwenden von ShellExecute und ShellExecuteEx
- Ein einfaches Beispiel für die Verwendung von ShellExecuteEx
Verwenden von ShellExecute und ShellExecuteEx
Um ShellExecute oder ShellExecuteEx zu verwenden, muss Ihre Anwendung das Datei- oder Ordnerobjekt angeben, das bearbeitet werden soll, und ein verb Objekt, das den Vorgang angibt. Weisen Sie für ShellExecute diese Werte den entsprechenden Parametern zu. Füllen Sie für ShellExecuteEx die entsprechenden Member einer SHELLEXECUTEINFO-Struktur aus. 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 (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 finden, welche Verben verfügbar sind, suchen Sie in der Registrierung unter
HKEY_CLASSES_ROOT\CLSID\{object_clsid}\Shell\verb
dabei ist object_clsid der Klassenbezeichner (CLSID) des Objekts und verb der Name des verfügbaren verbObjekts. Der verb\Befehlsunterschlüssel enthält die Daten, die angeben, was passiert, wenn dies verb aufgerufen wird.
Um herauszufinden, welche Verben für vordefinierte Shell Objekte verfügbar sind, suchen Sie in der Registrierung unter
\ HKEY_CLASSES_ROOTobject_name\shell\verb
dabei ist object_name der Name des vordefinierten Shell Objekts. Auch hier enthält der verb\Befehlsunterschlüssel die Daten, die angeben, was beim verb Aufrufen geschieht.
Häufig verfügbare Verben umfassen:
Verb | BESCHREIBUNG |
---|---|
edit | Startet einen Editor und öffnet das Dokument zur Bearbeitung. |
find | Initiiert eine Suche beginnend mit 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. |
Druckt die Dokumentdatei. | |
properties | Zeigt die Eigenschaften des Objekts an. |
runas | Startet eine Anwendung als Administrator. Die Benutzerkontensteuerung (User Account Control, UAC) fordert den Benutzer auf, der Anwendung mit erhöhten Rechten zuzustimmen oder die Anmeldeinformationen eines Administratorkontos einzugeben, mit dem die Anwendung ausgeführt wird. |
Jeder verb entspricht dem Befehl, der zum Starten der Anwendung aus einem Konsolenfenster verwendet wird. Das openverb ist ein gutes Beispiel, da es häufig unterstützt wird. Bei .exe Dateien open startet einfach die Anwendung. Es wird jedoch häufiger verwendet, um eine Anwendung zu starten, die auf einer bestimmten Datei arbeitet. Beispielsweise können .txt Dateien von Microsoft WordPad geöffnet werden. Die openverb 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 verwenden, um eine .txt Datei zu öffnen, wird Wordpad.exe mit der angegebenen Datei als Argument gestartet. Einige Befehle können zusätzliche Argumente haben, 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, der den Standardbefehl für den Dateityp aufruft. Dieses Verfahren entspricht in der Regel dem Festlegen von lpVerb auf "open", aber einige Dateitypen verfügen möglicherweise über einen anderen Standardbefehl. Weitere Informationen finden Sie im Erweitern von Kontextmenüs und in der Referenzdokumentation zu ShellExecuteEx.
Verwenden von ShellExecuteEx zum Bereitstellen von Aktivierungsdiensten von einem Standort
Die Dienste einer Websitekette können viele Verhaltensweisen der Elementaktivierung steuern. Ab Windows 8 können Sie einen Zeiger auf die Site-Chain an ShellExecuteEx übergeben, um diese Verhaltensweisen zu aktivieren. So stellen Sie die Website für ShellExecuteEx bereit:
- Geben Sie das SEE_MASK_FLAG_HINST_IS_SITE Flag im fMask-Mitglied von SHELLEXECUTEINFO an.
- Geben Sie " IUnknown" im hInstApp-Mitglied von SHELLEXECUTEINFO an.
Verwenden von ShellExecute zum Starten des Suchdialogfelds
Wenn ein Benutzer mit der rechten Maustaste auf ein Ordnersymbol in Windows Explorer klickt, lautet eines der Menüelemente "Suchen". Wenn sie dieses Element auswählen, wird das Shell Suchhilfsprogramm gestartet. Dieses Hilfsprogramm zeigt ein Dialogfeld an, das zum Durchsuchen von Dateien nach einer angegebenen Textzeichenfolge verwendet werden kann. Eine Anwendung kann das Suchprogramm für ein Verzeichnis programmgesteuert starten, indem ShellExecute aufgerufen wird, mit "find" als lpVerb-Parameter und dem Verzeichnispfad als lpFile-Parameter . Beispielsweise startet die folgende Codezeile das Suchhilfsprogramm 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 die erste .bmp Datei gefunden wird. 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 erforderlich ist.
Sobald die erste .bmp-Datei gefunden wurde, werden den Mitgliedern 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 "öffnen". Die Struktur wird dann an ShellExecuteEx übergeben, wodurch der Standardhandler für Bitmapdateien gestartet wird, in der Regel MSPaint.exe, an open die Datei. Nachdem die Funktion zurückgegeben wurde, werden die PIDLs freigegeben, und die IShellFolder-Schnittstelle des Windows-Ordners wird freigegeben.