Uruchamianie aplikacji (ShellExecute, ShellExecuteEx, SHELLEXECUTEINFO)
Gdy aplikacja znajduje obiekt pliku, następnym krokiem jest często wykonywanie na nim działań w jakiś sposób. Na przykład aplikacja może chcieć uruchomić inną aplikację, która umożliwia użytkownikowi modyfikowanie pliku danych. Jeśli interesujący go plik jest plikiem wykonywalnym, aplikacja może po prostu chcieć go uruchomić. W tym dokumencie omówiono sposób używania ShellExecute lub ShellExecuteExecuteEx do wykonywania tych zadań.
Korzystanie z funkcji ShellExecute i ShellExecuteEx
Aby użyć ShellExecute lub ShellExecuteEx, aplikacja musi określić obiekt pliku lub folderu, na którym ma być wykonywane działanie, oraz czasownik , który określa operację. W przypadku ShellExecuteprzypisz te wartości do odpowiednich parametrów. W przypadku ShellExecuteExwypełnij odpowiednie człony struktury SHELLEXECUTEINFO. Istnieje również kilka innych elementów członkowskich lub parametrów, których można użyć do dostosowania zachowania tych dwóch funkcji.
Obiekty plików i folderów mogą być częścią systemu plików lub obiektów wirtualnych i mogą być identyfikowane przez ścieżki lub wskaźniki do list identyfikatorów elementów (PIDLs).
Czasowniki obiektów
Czasowniki dostępne dla obiektu to zasadniczo elementy, które można znaleźć w menu skrótów obiektu. Aby dowiedzieć się, które czasowniki są dostępne, poszukaj w rejestrze pod
HKEY_CLASSES_ROOT\CLSID\{object_clsid}\Shell\verb
gdzie object_clsid jest identyfikatorem klasy (CLSID) obiektu, a polecenie jest nazwą dostępnej czynności. Podkluczczasownika \ zawiera dane wskazujące, co się dzieje po wywołaniu tego polecenia.
Aby dowiedzieć się, które czasowniki są dostępne dla wcześniej zdefiniowanych obiektów powłoki, znajdź w rejestrze pod
HKEY_CLASSES_ROOT\object_name\shell\czasownik
gdzie object_name jest nazwą wstępnie zdefiniowanego obiektu powłoki. Ponownie, czasownik \polecenia podklucz zawiera dane wskazujące, co się dzieje, gdy ten czasownik jest wywołany.
Często dostępne czasowniki to:
Czasownik | Opis |
---|---|
redagować | Uruchamia edytor i otwiera dokument do edycji. |
znaleźć | Inicjuje wyszukiwanie rozpoczynające się od określonego katalogu. |
Otwórz | Uruchamia aplikację. Jeśli ten plik nie jest plikiem wykonywalnym, zostanie uruchomiona skojarzona aplikacja. |
drukować | Drukuje plik dokumentu. |
Właściwości | Wyświetla właściwości obiektu. |
runas | Uruchamia aplikację jako administrator. Kontrola konta użytkownika (UAC) poprosi użytkownika o zgodę na uruchomienie aplikacji z podwyższonym poziomem uprawnień lub o wprowadzenie poświadczeń konta administratora do uruchomienia aplikacji. |
Każde zlecenie odpowiada poleceniu, które będzie używane do uruchamiania aplikacji z okna konsoli. Otwarty czasownik jest dobrym przykładem, ponieważ jest on często obsługiwany. W przypadku plików .exe otwarcie po prostu uruchamia aplikację. Jednak częściej jest używana do uruchamiania aplikacji, która działa na określonym pliku. Na przykład pliki .txt można otwierać za pomocą programu Microsoft WordPad. Otwarcie czasownika dla pliku .txt odpowiadałoby temu podobnemu do następującego polecenia:
"C:\Program Files\Windows NT\Accessories\Wordpad.exe" "%1"
Jeśli używasz ShellExecute lub ShellExecuteEx, aby otworzyć plik .txt, Wordpad.exe jest uruchamiany z tym plikiem jako argumentem. Niektóre polecenia mogą mieć dodatkowe argumenty, takie jak flagi, które można dodać zgodnie z potrzebami, aby prawidłowo uruchomić aplikację. Aby dowiedzieć się więcej na temat menu skrótów i czasowników, przejdź do Rozszerzanie menu skrótów.
Ogólnie rzecz biorąc, próba określenia listy dostępnych czasowników dla określonego pliku jest nieco skomplikowana. W wielu przypadkach można po prostu ustawić parametr lpVerb na null, który wywołuje domyślne polecenie dla typu pliku. Ta procedura jest zwykle równoważna ustawieniu lpVerb na "otwarte", ale niektóre typy plików mogą mieć inne polecenie domyślne. Aby uzyskać więcej informacji, zobacz Rozszerzanie menu skrótów i dokumentację referencyjną ShellExecuteEx.
Używanie elementu ShellExecuteEx do świadczenia usług aktywacji ze strony
Usługi łańcucha witryn mogą kontrolować wiele zachowań aktywacji elementów. Od systemu Windows 8 można podać wskaźnik do łańcucha witryn, aby ShellExecuteEx włączyć te zachowania. W celu udostępnienia witryny za pomocą ShellExecuteEx:
- Określ flagę SEE_MASK_FLAG_HINST_IS_SITE w fMask członka struktury SHELLEXECUTEINFO.
- PodajIUnknown w hInstApp członkiem SHELLEXECUTEINFO.
Uruchamianie okna dialogowego wyszukiwania przy użyciu funkcji ShellExecute
Gdy użytkownik kliknie prawym przyciskiem myszy ikonę folderu w Eksploratorze Windows, jednym z elementów menu jest "Wyszukaj". Jeśli wybiorą ten element, Shell uruchomi swoje narzędzie wyszukiwania. To narzędzie wyświetla okno dialogowe, którego można użyć do wyszukiwania plików dla określonego ciągu tekstowego. Aplikacja może programowo uruchomić narzędzie wyszukiwania dla katalogu, wywołując ShellExecute, z wartością "find" jako parametrem lpVerb i ścieżką katalogu jako parametrem lpFile. Na przykład następujący wiersz kodu uruchamia narzędzie Search dla katalogu c:\MyPrograms.
ShellExecute(hwnd, "find", "c:\\MyPrograms", NULL, NULL, 0);
Prosty przykład używania elementu ShellExecuteEx
Poniższa przykładowa aplikacja konsolowa ilustruje użycie ShellExecuteEx. Większość kodu sprawdzania błędów została pominięta w celu zapewnienia przejrzystości.
#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;
}
Aplikacja najpierw pobiera kod PIDL katalogu systemu Windows i wylicza jego zawartość do momentu znalezienia pierwszego pliku .bmp. W przeciwieństwie do wcześniejszego przykładu IShellFolder::GetDisplayNameOf jest używany do pobierania nazwy analizowania pliku zamiast nazwy wyświetlanej. Ponieważ jest to folder systemu plików, nazwa analizy jest w pełni kwalifikowaną ścieżką, która jest wymagana do ShellExecuteEx.
Po zlokalizowaniu pierwszego pliku .bmp odpowiednie wartości są przypisywane do elementów członkowskich struktury SHELLEXECUTEINFO. Element członkowski lpFile jest ustawiony na nazwę analizowania pliku, a element członkowski lpVerbnull, aby rozpocząć operację domyślną. W takim przypadku domyślną operacją jest "otwórz". Struktura jest następnie przekazywana do ShellExecuteEx, która uruchamia domyślną procedurę obsługi plików map bitowych, zazwyczaj MSPaint.exe, aby otworzyć plik. Po powrocie funkcji listy PIDL zostaną zwolnione, a interfejs IShellFolder folderu systemu Windows zostanie zwolniony.