Avvio di applicazioni (ShellExecute, ShellExecuteEx, SHELLEXECUTEINFO)

Dopo che l'applicazione ha individuato un oggetto file, il passaggio successivo consiste spesso nell'agire su di esso in qualche modo. Ad esempio, l'applicazione potrebbe voler avviare un'altra applicazione che consente all'utente di modificare un file di dati. Se il file di interesse è un eseguibile, l'applicazione potrebbe voler semplicemente avviarla. Questo documento illustra come usare ShellExecute o ShellExecuteEx per eseguire queste attività.

Uso di ShellExecute e ShellExecuteEx

Per usare ShellExecute o ShellExecuteEx, l'applicazione deve specificare il file o l'oggetto cartella su cui agire e un verbo che specifica l'operazione. Per ShellExecute, assegnare questi valori ai parametri appropriati. Per ShellExecuteEx compilare i membri appropriati di una struttura SHELLEXECUTEINFO . Esistono anche diversi altri membri o parametri che possono essere usati per ottimizzare il comportamento delle due funzioni.

Gli oggetti file e cartelle possono far parte del file system o degli oggetti virtuali e possono essere identificati da percorsi o puntatori agli elenchi di identificatori di elemento (PIDL).

Verbi oggetto

I verbi disponibili per un oggetto sono essenzialmente gli elementi disponibili nel menu di scelta rapida di un oggetto. Per trovare i verbi disponibili, cercare nel Registro di sistema in

HKEY_CLASSES_ROOT\CLSID\{object_clsid}\Guscio\Verbo

dove object_clsid è l'identificatore di classe (CLSID) dell'oggetto e il verbo è il nome del verbo disponibile. La sottochiave delcomandoverbo\ contiene i dati che indicano cosa accade quando viene richiamato il verbo.

Per scoprire quali verbi sono disponibili per gli oggetti Shell predefiniti, cercare nel Registro di sistema in

HKEY_CLASSES_ROOT\Object_name\Guscio\Verbo

dove object_name è il nome dell'oggetto Shell predefinito. Anche in questo caso, la sottochiave del comando verbo\ contiene i dati che indicano cosa accade quando viene richiamato il verbo.

I verbi comunemente disponibili includono:

Verbo Descrizione
modifica Avvia un editor e apre il documento per la modifica.
trovare Avvia una ricerca a partire dalla directory specificata.
apre Avvia un'applicazione. Se questo file non è un file eseguibile, viene avviata l'applicazione associata.
print Stampa il file di documento.
properties Visualizza le proprietà dell'oggetto.
RunAs Avvia un'applicazione come amministratore. Controllo dell'account utente richiederà all'utente il consenso per eseguire l'applicazione con privilegi elevati o immettere le credenziali di un account amministratore usato per eseguire l'applicazione.

Ogni verbo corrisponde al comando che verrebbe usato per avviare l'applicazione da una finestra della console. Il verbo aperto è un buon esempio, perché è comunemente supportato. Per .exe file, aprire semplicemente avvia l'applicazione. Tuttavia, viene usato più comunemente per avviare un'applicazione che opera su un determinato file. Ad esempio, .txt file possono essere aperti da Microsoft WordPad. Il verbo aperto per un file .txt corrisponde quindi a un comando simile al seguente:

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

Quando si usa ShellExecute o ShellExecuteEx per aprire un file .txt, Wordpad.exe viene avviato con il file specificato come argomento. Alcuni comandi possono avere argomenti aggiuntivi, ad esempio flag, che possono essere aggiunti in base alle esigenze per avviare correttamente l'applicazione. Per altre informazioni su menu di scelta rapida e verbi, vedere Estensione dei menu di scelta rapida.

In generale, il tentativo di determinare l'elenco dei verbi disponibili per un determinato file è piuttosto complicato. In molti casi, è sufficiente impostare il parametro lpVerb su NULL, che richiama il comando predefinito per il tipo di file. Questa procedura è in genere equivalente all'impostazione di lpVerb su "open", ma alcuni tipi di file possono avere un comando predefinito diverso. Per altre informazioni, vedere Estensione dei menu di scelta rapida e della documentazione di riferimento di ShellExecuteEx .

Uso di ShellExecuteEx per fornire servizi di attivazione da un sito

I servizi di una catena di siti possono controllare molti comportamenti di attivazione degli elementi. A partire da Windows 8, è possibile fornire un puntatore alla catena di siti a ShellExecuteEx per abilitare questi comportamenti. Per fornire il sito a ShellExecuteEx:

Uso di ShellExecute per avviare la finestra di dialogo di ricerca

Quando un utente fa clic con il pulsante destro del mouse su un'icona di cartella in Esplora risorse, una delle voci di menu è "Cerca". Se selezionano tale elemento, shell avvia l'utilità Di ricerca. Questa utilità visualizza una finestra di dialogo che può essere usata per cercare una stringa di testo specificata. Un'applicazione può avviare a livello di codice l'utilità Search per una directory chiamando ShellExecute, con "find" come parametro lpVerb e il percorso della directory come parametro lpFile . Ad esempio, la riga di codice seguente avvia l'utilità Di ricerca per la directory c:\MyPrograms.

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

Esempio semplice di come usare ShellExecuteEx

L'applicazione console di esempio seguente illustra l'uso di ShellExecuteEx. La maggior parte del codice di controllo degli errori è stata omessa per maggiore chiarezza.

#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'applicazione recupera prima il PIDL della directory di Windows ed enumera il relativo contenuto fino a quando non trova il primo file .bmp. A differenza dell'esempio precedente, IShellFolder::GetDisplayNameOf viene usato per recuperare il nome di analisi del file anziché il nome visualizzato. Poiché si tratta di una cartella del file system, il nome di analisi è un percorso completo, che è ciò che è necessario per ShellExecuteEx.

Dopo aver individuato il primo file .bmp, i valori appropriati vengono assegnati ai membri di una struttura SHELLEXECUTEINFO . Il membro lpFile è impostato sul nome di analisi del file e sul membro lpVerb su NULL per avviare l'operazione predefinita. In questo caso, l'operazione predefinita è "aperta". La struttura viene quindi passata a ShellExecuteEx, che avvia il gestore predefinito per i file bitmap, in genere MSPaint.exe, per aprire il file. Al termine della funzione, i PIDL vengono liberati e l'interfaccia IShellFolder della cartella Windows viene rilasciata.