Creazione di pagine delle proprietà personalizzate
Quando un provider di pagine delle proprietà del dispositivo gestisce una richiesta per creare una pagina di proprietà per il dispositivo o la classe dispositivo, il provider deve seguire questa procedura:
Chiamare SetupDiGetClassInstallParams per ottenere i parametri di installazione della classe corrente per il dispositivo. Ad esempio:
SP_ADDPROPERTYPAGE_DATA AddPropertyPageData; : ZeroMemory(&AddPropertyPageData, sizeof(SP_ADDPROPERTYPAGE_DATA)); AddPropertyPageData.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER); if (SetupDiGetClassInstallParams(DeviceInfoSet, DeviceInfoData, (PSP_CLASSINSTALL_HEADER)&AddPropertyPageData, sizeof(SP_ADDPROPERTYPAGE_DATA), NULL )) { ...
In questo esempio il codice zero inizializza la struttura in cui verranno restituiti i parametri di installazione del dispositivo e imposta le dimensioni dell'intestazione di installazione della classe nel campo cbSize , come richiesto da SetupDiGetClassInstallParams. L'intestazione di installazione della classe è il primo membro di ogni struttura dei parametri di installazione della classe.
Assicurarsi che il numero massimo di pagine dinamiche per il dispositivo non sia ancora stato soddisfatto usando un'istruzione, ad esempio quanto segue:
if (AddPropertyPageData.NumDynamicPages < MAX_INSTALLWIZARD_DYNAPAGES) ...
Se il test ha esito negativo, non inizializzare o creare la pagina. Restituisce invece NO_ERROR.
Allocare memoria in cui salvare i dati specifici del dispositivo necessari più avanti nella procedura della finestra di dialogo e inizializzare questa memoria con i dati. Il provider deve rilasciare questa memoria nel callback della pagina delle proprietà quando la pagina delle proprietà viene eliminata.
Per i provider che sono co-installer, questi dati specifici del dispositivo devono includere il codice DeviceInfoSet e DeviceInfoData passato con DIF_ADDPROPERTYPAGE_ADVANCED il codice DIF (DeviceInfoSet e DeviceInfoData).
Ad esempio, un provider di pagine delle proprietà può definire e usare una struttura come illustrato nell'esempio seguente:
typedef struct _TEST_PROP_PAGE_DATA { HDEVINFO DeviceInfoSet; PSP_DEVINFO_DATA DeviceInfoData; } TEST_PROP_PAGE_DATA, *PTEST_PROP_PAGE_DATA; ... PTEST_PROP_PAGE_DATA pMyPropPageData; ... pMyPropPageData = HeapAlloc(GetProcessHeap(), 0, sizeof(TESTPROP_PAGE_DATA));
Inizializzare una struttura PROPSHEETPAGE con informazioni sulla pagina delle proprietà personalizzate:
- In dwFlags impostare il flag di PSP_USECALLBACK e tutti gli altri flag necessari per la pagina delle proprietà personalizzate. Il flag PSP_USECALLBACK indica che è stata fornita una funzione di callback.
- In pfnCallback impostare un puntatore alla funzione di callback per la pagina delle proprietà. Nel callback elaborare il messaggio di PSPCB_RELEASE e liberare la memoria allocata nel passaggio 3.
- In pfnDlgProc impostare un puntatore alla procedura della finestra di dialogo per la pagina delle proprietà.
- In lParam passare un puntatore all'area di memoria allocata e inizializzata nel passaggio 3.
- Impostare altri membri come appropriato per la pagina delle proprietà personalizzate. Per altre informazioni sulla struttura PROPSHEETPAGE, vedere la documentazione Microsoft Windows SDK.
Chiamare CreatePropertySheetPage per creare la nuova pagina.
Aggiungere la nuova pagina all'elenco delle pagine delle proprietà dinamiche nel membro DynamicPages dei parametri di installazione della classe e incrementare il membro NumDynamicPages .
Ripetere i passaggi da 2 a 6 per ogni pagina di proprietà personalizzata aggiuntiva.
Chiamare SetupDiSetClassInstallParams per impostare i nuovi parametri di installazione della classe, che includono la struttura della pagina delle proprietà aggiornata.
Restituire NO_ERROR.
Windows aggiunge le pagine delle proprietà appena create al foglio delle proprietà per il dispositivo e Gestione dispositivi effettua chiamate API Microsoft Win32 per creare il foglio. Quando viene visualizzata la pagina delle proprietà, il sistema chiama la procedura della finestra di dialogo specificata nella struttura PROPSHEETPAGE.