Aggiunta di icone, anteprime e menu di scelta rapida

Per assicurarsi che i dati vengano indicizzati e presentati correttamente all'utente durante le ricerche, è necessario implementare archivi dati shell (noti anche come estensioni dello spazio dei nomi shell) e gestori di tipi di file (noti anche come estensioni shell, gestori di estensioni o gestori di estensioni shell).

In questo argomento vengono descritte le interfacce seguenti:

Implementazione dei gestori dei tipi di file

Queste estensioni shell o gestori di tipi di file forniscono agli utenti le esperienze shell seguenti:

  • Nella visualizzazione risultati viene visualizzata un'icona specifica per il tipo di elemento.
  • La visualizzazione dei risultati visualizza un'anteprima dell'elemento quando l'utente seleziona l'elemento.
  • Gli utenti possono fare doppio clic sugli elementi per avviare eventi come l'apertura del file.
  • Gli utenti possono fare clic con il pulsante destro del mouse sugli elementi per accedere a un menu di scelta rapida (scelta rapida).
  • Gli utenti possono trascinare gli elementi.

Analogamente a tutti gli oggetti COM (Component Object Model), i gestori dei tipi di file devono implementare un'interfaccia IUnknown e una class factory.

In Windows XP o versioni precedenti, anche i gestori devono implementare:

In Windows Vista l'interfaccia IPersistFile e l'interfaccia IShellExtInit sono state sostituite dalle tre interfacce seguenti per Shell per inizializzare il gestore:

Per offrire un'esperienza utente ragionevole, è necessario fornire un archivio dati shell con il gestore del protocollo. Tale archivio dati funge quindi da "factory" per i gestori di icone, i gestori di menu di scelta rapida, i gestori di anteprima e così via. Le implementazioni minime dell'interfaccia IPersist e dell'interfaccia IPersistFolder sono richieste dall'interfaccia IShellFolder e per IContextMenu e IExtractIcon è necessaria un'implementazione minima dell'interfaccia IShellFolder.

Nota

Lo stesso identificatore di classe (CLSID) deve essere implementato per IPersist, IPersistFolder e IShellFolder.

 

Per altre informazioni sulla creazione di un archivio dati shell per supportare un gestore di protocollo, vedere Implementazione delle interfacce oggetto cartella di base.

Ipersist

L'interfaccia IPersist definisce il metodo singolo GetClassID, progettato per fornire il CLSID di un oggetto che può essere archiviato in modo permanente nel sistema.

Metodo Descrizione
GetClassID Restituisce il CLSID dell'oggetto archivio dati shell

 

IPersistFolder

L'interfaccia IPersistFolder viene utilizzata per inizializzare gli oggetti della cartella Shell. L'implementazione di questa interfaccia, derivata da IPersist, è il modo in cui viene indicato dove si trova nello spazio dei nomi shell. Questa interfaccia non viene usata direttamente. Viene usato dall'implementazione del file system del metodo IShellFolder::BindToObject quando inizializza un oggetto cartella shell.

Metodo Descrizione
Initialize Indica a un oggetto cartella shell di inizializzarsi in base alle informazioni passate e restituisce S_OK

 

IShellFolder

L'interfaccia IShellFolder viene usata per gestire le cartelle e è necessaria un'implementazione parziale in modo che l'icona e le interfacce di contesto implementate per un gestore di protocollo si comportino correttamente nell'interfaccia utente dei risultati di Windows Search. La maggior parte delle funzionalità necessarie viene esposta tramite il metodo GetUIObjectOf . Questo metodo consente a un componente aggiuntivo di eseguire una query per le interfacce IExtractIcon e IContextMenu .

L'interfaccia IShellFolder usa PIDLs anziché URL. A differenza dei requisiti di un archivio dati shell completo, i componenti aggiuntivi possono usare una semplice struttura IDL che contiene solo l'URL.

È necessario implementare i metodi seguenti dell'interfaccia IShellFolder . Cinque di questi metodi richiedono un'implementazione minima.

Metodo Descrizione
BindToObject Restituisce E_NOTIMPL
BindToStorage Restituisce E_NOTIMPL
CreateViewObject Restituisce E_NOTIMPL
SetNameOf Restituisce E_NOTIMPL
ParseDisplayName Converte un URL nella struttura PIDL
CompareID Confronta due valori PIDL
GetDisplayNameOf Restituisce l'URL di un FILE PIDL
GetUIObjectOf Questo metodo è simile al metodo IUnknown::QueryInterface. Se viene richiesta un'icona, il chiamante richiede il IID_IExtractIcon; se viene richiesto un menu di scelta rapida, il chiamante richiede il IID_IContextMenu

 

IShellFolder non viene usato per enumerare le cartelle. Ciò significa che il nome visualizzato di una cartella sarà l'URL fisico. Questo potrebbe cambiare in futuro.

IContextMenu

Quando Windows Search visualizza i risultati all'utente, l'utente può fare clic con il pulsante destro del mouse su un elemento e visualizzare un menu di scelta rapida definito dall'interfaccia IContextMenu . I menu di scelta rapida sono noti anche come menu di scelta rapida.

L'azione predefinita nel menu di scelta rapida è la stessa azione eseguita quando si fa doppio clic sull'elemento. Senza le interfacce IShellFolder o IContextMenu corrispondenti per l'elemento, il comportamento predefinito per un evento di doppio clic consiste nel passare l'URL come argomento alla funzione Funzione ShellExecute .

Per altre informazioni sulla creazione di gestori di menu di scelta rapida e su Esempio: Estensioni shell per gestori di protocollo per il codice di esempio, vedere Creazione di gestori di menu di scelta rapida.

IExtractIcon

IExtractIcon recupera un'icona per l'interfaccia utente di Windows Search in base all'URL nel PIDL fornito dal gestore del protocollo.

Per altre informazioni sulla creazione di gestori di icone e su Esempio: Estensioni della shell per gestori di protocollo per il codice di esempio, vedere Creazione di gestori di icone.

IPreviewHandler

IPreviewHandler esegue il rendering di un'anteprima avanzata di un elemento selezionato in Esplora risorse. Le anteprime sono disponibili in Windows Search 4.0 o in Windows Vista con Windows Desktop Search 3.x.

Per creare un gestore di anteprima personalizzato:

  1. Implementare un IPreviewHandler che accetta un IStream, seguendo le linee guida fornite in Gestori di anteprima.

  2. Registrare il gestore di anteprima:

    HKEY_CLASSES_ROOT\<Your_Object_Type>
    
    HKEY_CLASSES_ROOT\<Your_Object_Type>\ShellEx
    
    HKEY_CLASSES_ROOT\<Your_Object_Type>\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f}
       @ = {<Your_PreviewHandler_GUID>}
    
  3. Completare i due passaggi seguenti per implementare una cartella shell per l'URL:

    1. In Metodo IShellFolder::GetUIObjectOf gestire IQueryAssociations e restituire l'associazione per gli elementi della shell, come illustrato nell'esempio di codice seguente.

      CComPtr<IQueryAssociations> spqa;
      AssocCreate(CLSID_QueryAssociations, __uuidof(IQueryAssociations), &spqa);
      spqa->Init(0, L"Your_Object_Type", NULL, NULL);
      spqa->QueryInterface(riid, ppvReturn);
      
    2. Dopo che shell esegue una query sulla cartella Shell per il flusso di dati per inizializzare il gestore di anteprima, passare al metodo IShellFolder::BindToObject, gestire IID_IStream e restituire un IStream all'URL.

Per riutilizzare un gestore di anteprima esistente per il tipo di file, seguire questa procedura:

  1. Registrare il gestore di anteprima per il tipo di file usando il CLSID del gestore di anteprima esistente al posto di <Your_PreviewHandler_GUID>.
  2. Implementare una cartella shell.

Per altre informazioni sulla creazione di gestori di anteprima, vedere IPreviewHandler e Gestori di anteprima.

Risorse aggiuntive

Informazioni concettuali

Sviluppo di gestori di protocollo

Informazioni sui gestori di protocolli

Notifica dell'indice delle modifiche

Esempio di codice: estensioni della shell per gestori di protocollo

Installazione e registrazione dei gestori di protocollo

Creazione di un connettore di ricerca per un gestore di protocolli

Debug dei gestori del protocollo