Condividi tramite


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 volerla semplicemente avviare. 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 l'oggetto file o cartella su cui agire e un verb oggetto 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 a elenchi di identificatori di elemento (PIDL).

Verbi degli oggetti

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.

\ HKEY_CLASSES_ROOTCLSID\{object_clsid}\Shell\verb

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

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

\ HKEY_CLASSES_ROOTobject_name\shell\verb

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

I verbi comunemente disponibili includono:

Verb Descrizione
edit Avvia un editor e apre il documento per la modifica.
find Avvia una ricerca a partire dalla directory specificata.
open 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 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.

Ognuno verb corrisponde al comando che verrebbe usato per avviare l'applicazione da una finestra della console. open verb È un buon esempio, in quanto è comunemente supportato. Per .exe file, open avvia semplicemente l'applicazione. Tuttavia, è più comunemente usato per avviare un'applicazione che opera su un determinato file. Ad esempio, .txt file possono essere aperti da Microsoft WordPad. Il comando openverb per un file .txt corrisponderebbe quindi a qualcosa di 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, puoi 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 quell'elemento, il sistema avvia la sua utilità di ricerca Shell. Questa utilità visualizza una finestra di dialogo che può essere usata per cercare una stringa di testo specificata nei file. Un'applicazione può avviare a livello di codice l'utilità di ricerca 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 finché 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 dell'analisi è un percorso completo, che è necessario per ShellExecuteEx.

Una volta 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, al open file. Al termine della funzione, i PIDL vengono liberati e viene rilasciata l'interfaccia IShellFolder della cartella Windows.