Condividi tramite


Conformità STRICT

Alcuni codici sorgente compilati correttamente potrebbero generare messaggi di errore quando si abilita controllo dei tipi STRICT. Le sezioni seguenti descrivono i requisiti minimi per la compilazione del codice quando strict è abilitato. Sono consigliati passaggi aggiuntivi, in particolare per produrre codice portabile.

Requisiti generali

Il requisito principale è che è necessario dichiarare tipi di handle e puntatori a funzione corretti anziché basarsi su tipi più generali. Non è possibile usare un tipo di handle in cui è previsto un altro. Ciò significa anche che potrebbe essere necessario modificare le dichiarazioni di funzione e usare più cast di tipo.

Per ottenere risultati ottimali, il tipo HANDLE generico deve essere usato solo quando necessario.

Dichiarazione di funzioni all'interno dell'applicazione

Assicurarsi che tutte le funzioni dell'applicazione siano dichiarate. È consigliabile inserire tutte le dichiarazioni di funzione in un file di inclusione perché è possibile analizzare facilmente le dichiarazioni e cercare i parametri e i tipi restituiti da modificare.

Se si usa l'opzione del compilatore /Zg per creare file di intestazione per le funzioni, tenere presente che si otterranno risultati diversi a seconda che sia stato abilitato controllo dei tipi STRICT. Con STRICT disabilitato, tutti i tipi di handle generano lo stesso tipo di base. Con strict abilitata, genera tipi di base diversi. Per evitare conflitti, è necessario ricreare il file di intestazione ogni volta che si abilita o si disabilita STRICToppure modificare il file di intestazione per usare i tipi HWND, HDC, HANDLEe così via, anziché i tipi di base.

Qualsiasi dichiarazione di funzione copiata da Windows.h nel codice sorgente potrebbe essere stata modificata e la dichiarazione locale potrebbe non essere aggiornata. Rimuovere la dichiarazione locale.

Tipi che richiedono cast

Alcune funzioni hanno tipi o parametri restituiti generici. Ad esempio, la funzione SendMessage restituisce dati che possono essere di qualsiasi tipo, a seconda del contesto. Quando viene visualizzata una di queste funzioni nel codice sorgente, assicurarsi di usare il cast del tipo corretto e che sia il più specifico possibile. L'elenco seguente è un esempio di queste funzioni.

Quando chiami SendMessage, DefWindowProco SendDlgItemMessage, devi prima eseguire il cast del risultato al tipo UINT_PTR. È necessario eseguire passaggi simili per qualsiasi funzione che restituisce un valore LRESULT o LONG_PTR, in cui il risultato contiene un handle. Questa operazione è necessaria per la scrittura di codice portabile perché le dimensioni di un handle variano a seconda della versione di Windows. Il cast (UINT_PTR) garantisce una conversione corretta. Il codice seguente illustra un esempio in cui SendMessage restituisce un handle a un pennello:

HBRUSH hbr;

hbr = (HBRUSH)(UINT_PTR)SendMessage(hwnd, WM_CTLCOLOR, ..., ...);

Il parametro CreateWindow e CreateWindowExhmenu viene talvolta usato per passare un identificatore di controllo integer (ID). In questo caso, è necessario eseguire il cast dell'ID in un tipo di HMENU:

HWND hwnd;
int id;

hwnd = CreateWindow(
        TEXT("Button"), TEXT("OK"), BS_PUSHBUTTON,
        x, y, cx, cy, hwndParent,
        (HMENU)id,    // Cast required here
        hinst,
        NULL);

Considerazioni aggiuntive

Per ottenere il massimo vantaggio dal controllo dei tipi STRICT, sono disponibili linee guida aggiuntive da seguire. Se si apportano le modifiche seguenti, il codice sarà più portabile nelle versioni future di Windows.

I tipi WPARAM, LPARAM, LRESULTe LPVOID sono tipi di dati polimorfi. Contengono diversi tipi di dati in momenti diversi, anche quando controllo dei tipi STRICT è abilitato. Per ottenere il vantaggio del controllo dei tipi, è consigliabile eseguire il cast dei valori di questi tipi il prima possibile. Si noti che i cracker di messaggi recast wParam e lParam automaticamente in modo portabile.

Prestare particolare attenzione a distinguere HMODULE e tipi di HINSTANCE. Anche se strict abilitato, vengono definiti come lo stesso tipo di base. La maggior parte delle funzioni di gestione dei moduli kernel usa tipi di HINSTANCE, ma esistono alcune funzioni che restituiscono o accettano solo tipi di HMODULE.

la disabilitazione di strict

l'abilitazione di strict