Udostępnij przez


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ć elementu ShellExecute lub ShellExecuteEx, aplikacja musi określić obiekt pliku lub folderu, który ma być uruchamiany, i verb 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 i verb jest nazwą dostępnego verbobiektu . Podklucz verb\polecenia zawiera dane wskazujące, co się stanie podczas wywołania danego verb.

Aby dowiedzieć się, które czasowniki są dostępne dla wstępnie zdefiniowanych Shell obiektów, poszukaj w rejestrze systemowym w obszarze

\ HKEY_CLASSES_ROOTobject_name\shell\verb

gdzie object_name jest nazwą wstępnie zdefiniowanego Shell obiektu. Ponownie podklucz verb\polecenia zawiera dane wskazujące, co się dzieje, gdy następuje wywołanie verb.

Często dostępne czasowniki to:

Verb Opis
edit Uruchamia edytor i otwiera dokument do edycji.
find Inicjuje wyszukiwanie rozpoczynające się od określonego katalogu.
open Uruchamia aplikację. Jeśli ten plik nie jest plikiem wykonywalnym, zostanie uruchomiona skojarzona aplikacja.
print Drukuje plik dokumentu.
properties 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żdy verb odpowiada poleceniu, które będzie używane do uruchamiania aplikacji w oknie konsoli. To openverb jest dobry przykład, ponieważ jest on często obsługiwany. W przypadku .exe plików open wystarczy uruchomić 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. Element openverb dla pliku .txt odpowiadałby w ten sposób 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 "open", ale niektóre typy plików mogą mieć inne domyślne polecenie. 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:

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 element ShellExecute z parametrem "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 elementu ShellExecuteEx, który uruchamia domyślną procedurę obsługi dla plików map bitowych, zazwyczaj MSPaint.exe, do open pliku. Po powrocie funkcji listy PIDL zostaną zwolnione, a interfejs IShellFolder folderu systemu Windows zostanie zwolniony.