Compartilhar via


Conformidade ESTRITA

Alguns códigos-fonte compilados com êxito podem produzir mensagens de erro quando você habilita a verificação de tipo STRICT . As seções a seguir descrevem os requisitos mínimos para fazer seu código ser compilado quando STRICT estiver habilitado. Etapas adicionais são recomendadas, especialmente para produzir código portátil.

Requisitos gerais

O requisito principal é que você deve declarar tipos de identificador corretos e ponteiros de função em vez de depender de tipos mais gerais. Você não pode usar um tipo de identificador em que outro é esperado. Isso também significa que você pode ter que alterar declarações de função e usar mais conversões de tipo.

Para obter melhores resultados, o tipo HANDLE genérico deve ser usado somente quando necessário.

Declarando funções em seu aplicativo

Verifique se todas as funções de aplicativo foram declaradas. É recomendável colocar todas as declarações de função em um arquivo de inclusão porque você pode verificar facilmente suas declarações e procurar tipos de parâmetro e retorno que devem ser alterados.

Se você usar a opção do compilador /Zg para criar arquivos de cabeçalho para suas funções, lembre-se de que obterá resultados diferentes dependendo se você habilitou a verificação de tipo STRICT . Com STRICT desabilitado, todos os tipos de identificador geram o mesmo tipo base. Com STRICT habilitado, eles geram tipos base diferentes. Para evitar conflitos, você precisa recriar o arquivo de cabeçalho sempre que habilitar ou desabilitar o STRICT ou editar o arquivo de cabeçalho para usar os tipos HWND, HDC, HANDLE e assim por diante, em vez dos tipos base.

Todas as declarações de função copiadas do Windows.h para o código-fonte podem ter sido alteradas e sua declaração local pode estar desatualizada. Remova sua declaração local.

Tipos que exigem conversões

Algumas funções têm tipos de retorno ou parâmetros genéricos. Por exemplo, a função SendMessage retorna dados que podem ser qualquer número de tipos, dependendo do contexto. Quando você vir qualquer uma dessas funções em seu código-fonte, certifique-se de usar a conversão de tipo correta e se ela é a mais específica possível. A lista a seguir é um exemplo dessas funções.

Ao chamar SendMessage, DefWindowProc ou SendDlgItemMessage, primeiro você deve converter o resultado para o tipo UINT_PTR. Você precisa executar etapas semelhantes para qualquer função que retorne um valor LRESULT ou LONG_PTR , em que o resultado contém um identificador. Isso é necessário para escrever código portátil porque o tamanho de um identificador varia, dependendo da versão do Windows. A conversão (UINT_PTR) garante a conversão adequada. O código a seguir mostra um exemplo no qual SendMessage retorna um identificador para um pincel:

HBRUSH hbr;

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

Às vezes, o parâmetro CreateWindow e CreateWindowExé usado para passar um identificador de controle inteiro (ID). Nesse caso, você deve converter a ID em um tipo 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);

Considerações adicionais

Para aproveitar ao máximo a verificação de tipo STRICT , há diretrizes adicionais que você deve seguir. Seu código será mais portátil em versões futuras do Windows se você fizer as alterações a seguir.

Os tipos WPARAM, LPARAM, LRESULT e LPVOID são tipos de dados polimórficos. Eles contêm diferentes tipos de dados em momentos diferentes, mesmo quando a verificação de tipo STRICT está habilitada. Para obter o benefício da verificação de tipo, você deve converter valores desses tipos o mais rápido possível. (Observe que os biscoitos de mensagem reformulam automaticamente wParam e lParam para você de maneira portátil.)

Tome cuidado especial para distinguir os tipos HMODULE e HINSTANCE . Mesmo com STRICT habilitado, eles são definidos como o mesmo tipo base. A maioria das funções de gerenciamento de módulo de kernel usa tipos HINSTANCE , mas há algumas funções que retornam ou aceitam apenas tipos HMODULE .

Desabilitando STRICT

Habilitando o STRICT