BETA La rivista ipertestuale tecnica
BETA
BETA La rivista ipertestuale tecnicaBarra BETA
Barra Sito Beta.it

BETA 2299.5 - Programmazione: Costruiamo un'estensione della shell per Windows95  -  Indici | Guida

Clicca qui!

Costruiamo un'estensione della shell per Windows95

Parte 3

di Stefano Casini
Articolista, BETA

Installare un'estensione della shell

    Tre sono i metodi che si possono seguire per installare la nostra shell extension:
usare un file .REG;
usare un file .INF;
usare il programma REGSVR32.EXE.
Ognuno di questi metodi ha vantaggi e svantaggi, che non sto qui a dirvi; nel complesso, per i nostri scopi il metodo migliore è usare un file .INF.
A questo tipo di file viene associato da Windows un menu contestuale, Installa, che richiama la SETUPX.DLL, la DLL di base per l’installazione dei programmi.
La SETUPX.DLL accetta come parametro il nome di una sezione del file .INF (che è come struttura simile ai file INI di Windows 3.1); il valore di default per la sezione è DefaultInstall; se però volessimo noi chiamare da programma la SETUPX.DLL per fare un’installazione personalizzata, nessuno ci vieta di usare un’altra delle sezioni del file, per esempio la F_I_Install.
Per la disinstallazione, abbiamo dato (che fantasia) alla sezione il nome DefaultUninstall.
Le sezioni di installazione contengono delle entry dal nome che dice tutto (CopyFiles, DelFiles, AddReg, DelReg) che puntano ad altre sezioni del file.
La sezione SourceDisksNames contiene le etichette dei dischi di installazione, la sezione SourceDisksFiles contiene, per ogni file da installare, lindicazione su quale disco si trova; nel nostro caso abbiamo un solo disco.
Nella sezione DestinationDirs, il valore 11 individua la directory SYSTEM di Windows; per sapere a quali numeri corrispondo le altre directory fate una ricerca con parola chiave DestinationDirs sul file WIN95RK.HLP, che si trova nel CD di Windows95.
Nella sezione Strings, sono riportate le abbreviazioni delle stringhe utilizzate all’interno del file.
La sezione Version deve necessariamente contenere le due entry riportate, altrimenti l’installazione non funzionerà.
Vediamo più da vicino le sezioni in cui aggiungiamo qualcosa al registro: le abbiamo separate in due parti, una in cui ci sono le aggiunte necessarie per far funzionare la DLL, l’altra in cui ci sono le aggiunte necessarie per disinstallarla, ma potevano essere messe tutte sotto la stessa sezione.
Aggiungi.al.registro: le prime tre righe aggiungono la nostra DLL all’elenco dei CLSID registrati, mettendo la descrizione della DLL, il suo pathname, e specificandone il ThreadingModel;
Le successive due righe aggiungono il CLSID della DLL all’elenco dei ContextMenuHandlers per la classe di file di tipo Paint.Picture; abbiamo detto che questo è valido se i file con estensione .BMP sono gestiti da MSPAINT.EXE; se così non fosse, occorre aprire la chiave HKEY_CLASSES_ROOT\.BMP, leggere a destra la stringa scritta accanto a (Predefinito) e prenderne nota, quindi sostituire all’interno del file .INF a Paint.Picture detta stringa; salvare, e ripetere l’installazione. Questo purtroppo è uno degli svantaggi dell'installazione tramite il file .INF: se non si conosce a priori quale classe di file è associata ad una particolare estensione di file, l'installazione fallisce.
L’ultima riga della sezione è necessaria solo su Windows NT, e serve a registrare la nostra DLL tra quelle “approvate”.
Disinstallazione.dal.registro: le tre righe aggiungono un item all’elenco che viene mostrato quando si lancia dal Pannello di controllo l’applet Installazione applicazioni->Installa/Rimuovi; viene scritto nel registro sia la stringa che comparirà nell’elenco sia il pathname del programma che provvederà alla disinstallazione.
Nel nostro caso abbiamo scelto una soluzione classica: viene chiamata la funzione callback Uninstall, che abbiamo implementato nella nostra DLL, passandogli come parametro il pathname del file .INF; a sua volta, dopo aver chiesto conferma della disinstallazione, la funzione Uninstall lancia, tramite il comando START, di nuovo la SETUPX.DLL, in maniera tale che quando quest’ultima dovrà cancellare la nostra DLL la troverà sbloccata. Anche se la cosa è un poco macchinosa, funziona.

Conclusioni

    Siamo arrivati alla fine. Però, visto che l'appetito vien mangiando, se vogliamo aggiungere altri tipi di file, per esempio i .GIF, tra quelli manipolabili dalla nostra DLL, cosa bisogna fare?
Prima cosa, occorre modificare il file .INF in maniera da render noto al registro che la nostra DLL manipola anche i file .GIF, e questo si fa aggiungendo due righe simili a

HKCR,Paint.Picture\shellex\ContextMenuHandlers,,,
HKCR,Paint.Picture\shellex\ContextMenuHandlers\%DESCR%,,,
   "{98248760-F1AE-11d2-A4E2-004095D0529B}"
dove però al posto di Paint.Picture andrà messo il gestore dei file .GIF;
poi, all’interno della DLL, dove abbiamo inserito il codice che gestisce le BMP inseriremo uno switch per controllare se si tratta di GIF o BMP, ed il codice per gestire le GIF; ricompiliamo, reinstalliamo la DLL e tutto funzionerà perfettamente.
Se poi volessimo aggiungere, quando si clicca sul menu contestuale Proprietà delle nostre GIF o BMP, una finestra che ne mostri un’anteprima in miniatura, basterà estendere la derivazione della classe F_I_ShellExt alla classe IShellPropSheetExt, ed implementarne in maniera adeguata i metodi, ed aggiungere le righe di codice:
else if (IsEqualIID(riid, IID_IShellPropSheetExt))
        // riempiamo il valore di ritorno col puntatore all'interfaccia
        * ppv = (LPSHELLPROPSHEETEXT)this;
all’interno del metodo F_I_ShellExt::QueryInterface.
Riportiamo, di seguito, i sorgenti dei file usati per scrivere la DLL, e il file .INF utilizzato per installarla. Per quanto riguarda i file .RC e .DEF necessari per completare il progetto, questi sono praticamente vuoti, per cui omettiamo di riportarli.
 

Note e riferimenti

Sullo stesso argomento, si possono consultare i seguenti articoli già pubblicati su BETA:

[2] COM come COMplicato, BETA 2099.3
[1] I piddle del namespace, BETA 1898.1

entrambi dello stesso autore.

I listati dei file

Collegamento d'articolo Parte 1
Collegamento d'articolo Parte 2
Collegamento d'articolo Parte 3


Stefano Casini, ingegnere, è Articolista di BETA dal 1995 e svolge un lavoro che non ha nulla a che fare con la programmazione; è raggiungibile su Internet tramite la redazione oppure all'indirizzo etngh@tin.it.

Copyright © 1999 Stefano Casini, tutti i diritti sono riservati. Questo Articolo di BETA, insieme alla Rivista, è distribuito secondo i termini e le condizioni della Licenza Pubblica Beta, come specificato nel file LPB.

BETAe-mail info@beta.it
Barra Sito Beta.it
Frontespizio Abbonamenti a BETA Redazione Liste/Forum Informazioni Mirror ufficiali Beta Home Page Beta Home Page english Beta News BETA Rivista Articoli BETA Beta Edit, pubblicazioni Beta Logo, premi Beta Lpb, Licenza Pubblica e Articoli Lpb Beta Navigatore Beta Online Beta Library Beta Info Gruppo Beta BETA La rivista ipertestuale tecnica Collegamento al sito Web