Come creare gestori di icone

A un tipo di file è spesso associata un'icona personalizzata per renderli facilmente riconoscibili in Esplora risorse. Il modo più semplice per assegnare un'icona personalizzata a un tipo di file consiste nel registrare il file dell'icona. Tuttavia, un'icona registrata in questo modo sarà la stessa per tutti i membri del tipo di file. È possibile avere una maggiore flessibilità nell'assegnazione di icone ai membri del tipo di file implementando un gestore icone.

Un gestore icone è un tipo di gestore estensione shell che consente di assegnare dinamicamente icone ai membri di un tipo di file. Ogni volta che viene visualizzato un file del tipo, shell esegue una query sul gestore per l'icona appropriata. Ad esempio, un gestore icone può assegnare icone diverse a membri diversi del tipo di file o variare l'icona in base allo stato corrente del file.

Le procedure generali per l'implementazione e la registrazione di un gestore di estensioni shell sono descritte in Creazione di gestori di estensioni della shell. Questo documento è incentrato sugli aspetti dell'implementazione specifici dei gestori di icone.

Istruzioni

Passaggio 1: Implementazione dei gestori di icone

Analogamente a tutti i gestori di estensioni shell, i gestori di icone sono oggetti COM (Component Object Model) in-process implementati come DLL. Devono esportare due interfacce oltre a IUnknown: IPersistFile e IExtractIcon.

Shell inizializza il gestore tramite l'interfaccia IPersistFile . Usa questa interfaccia per richiedere l'identificatore di classe (CLSID) del gestore e lo fornisce con il nome del file. Il resto dell'operazione viene eseguito tramite l'interfaccia IExtractIcon . Per una descrizione generale su come implementare i gestori di estensione della shell, inclusa l'interfaccia IPersistFile , vedere Creazione di gestori estensioni shell. Nella parte restante di questo documento viene illustrato come implementare l'interfaccia IExtractIcon .

Passaggio 2: Implementazione dell'interfaccia IExtractIcon

Dopo l'inizializzazione dell'interfaccia, shell usa l'interfaccia IExtractIcon del gestore per richiedere l'icona appropriata. L'interfaccia ha due metodi: IExtractIcon::GetIconLocation e IExtractIcon::Extract.

Le icone vengono identificate dal percorso nel file system. Il metodo IExtractIcon::GetIconLocation viene chiamato per richiedere queste informazioni. Impostare il parametro szIconFile sul nome del file. Se nel file sono presenti più icone, impostare piIndex sull'indice dell'icona. Assegnare i valori appropriati alle due variabili di flag. Se non si vuole specificare un nome file o se non si vuole che shell estragga l'icona, impostare il flag GIL_NOTFILENAME nel parametro pwFlags . Non è necessario assegnare un valore a szIconFile, ma il gestore deve fornire handle di icona quando shell chiama IExtractIcon::Extract.

Se si restituisce un nome di file, shell tenta in genere di caricare l'icona dalla cache. Per impedire il caricamento di un'icona memorizzata nella cache, impostare il flag GIL_DONTCACHE nel parametro pwFlags . Se non viene caricata un'icona memorizzata nella cache, shell chiama IExtractIcon::Extract per richiedere l'handle dell'icona.

Se un file e un indice sono stati specificati da IExtractIcon::GetIconLocation, vengono passati rispettivamente ai parametri IExtractIcon::Extract nei parametri pszFile e nIconIndex . Se viene specificato un nome file, il gestore può restituire S_FALSE per fare in modo che shell estraa l'icona. In caso contrario, il gestore deve estrarre o altrimenti produrre icone grandi e piccole e assegnare i relativi handle HICON ai parametri phiconLarge e phiconSmall . Shell aggiunge le icone alla cache per accelerare le chiamate successive al gestore.

Passaggio 3: Registrazione dei gestori di icone

Quando si registra in modo statico un'icona per un tipo di file, si crea una sottochiave DefaultIcon in ProgID per il tipo di file. Il valore predefinito è impostato sul file che contiene l'icona. Per registrare un gestore icone, è comunque necessario avere la sottochiave DefaultIcon , ma il relativo valore predefinito deve essere impostato su "%1". Aggiungere una sottochiave IconHandler alla sottochiave Shellex della sottochiave ProgID e impostarne il valore predefinito sul formato stringa del GUID CLSID del gestore. Per informazioni generali su come registrare i gestori di estensioni della shell, vedere Creazione di gestori di estensioni della shell.

Nell'esempio seguente viene modificata la voce del Registro di sistema da Personalizzazione delle icone in modo che il tipo di file myp usi ora un gestore di menu di scelta rapida anziché un'icona definita in modo statico.

HKEY_CLASSES_ROOT
   .myp
      (Default) = MyProgram.1
   MyProgram.1
      (Default) = MyProgram Application
      DefaultIcon
         (Default) = %1
      Shellex
         IconHandler
            (Default) = {The handler's CLSID GUID}

Creazione di gestori di estensione della shell

Ipersistfile

IExtractIcon