Partilhar via


Conformidade RIGOROSA

Alguns códigos-fonte compilados com êxito podem produzir mensagens de erro quando você habilita verificação de tipo de STRICT. As seções a seguir descrevem os requisitos mínimos para fazer seu código compilar 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 os tipos de identificador e ponteiros de função corretos em vez de confiar em tipos mais gerais. Não é possível usar um tipo de identificador onde outro é esperado. Isso também significa que você pode ter que alterar declarações de função e usar mais tipos de casts.

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

Declarando funções em seu aplicativo

Certifique-se de que todas as funções do aplicativo estão declaradas. Colocar todas as declarações de função em um arquivo de inclusão é recomendado porque você pode facilmente verificar suas declarações e procurar tipos de parâmetro e retorno que devem ser alterados.

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

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

Tipos que exigem moldes

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

Quando você chama SendMessage, DefWindowProcou SendDlgItemMessage, você deve primeiro converter o resultado para digitar UINT_PTR. Você precisa executar etapas semelhantes para qualquer função que retorne um valor de ou LONG_PTR LRESULT, onde 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. O elenco (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, ..., ...);

O CreateWindow e parâmetro CreateWindowExhmenu às vezes é usado para passar um identificador de controle inteiro (ID). Nesse caso, você deve converter o ID para um HMENU tipo:

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 obter o máximo benefício de verificação de tipo de ESTRITA, há diretrizes adicionais que você deve seguir. Seu código será mais portátil em versões futuras do Windows se você fizer as seguintes alterações.

Os tipos WPARAM , LPARAM, LRESULTe LPVOID são tipos de dados polimórficos. Eles armazenam diferentes tipos de dados em momentos diferentes, mesmo quando verificação de tipo STRICT está habilitada. Para obter o benefício da verificação de tipos, você deve lançar valores desses tipos o mais rápido possível. (Observe que os crackers de mensagens reformulam automaticamente wParam e lParam para você de forma portátil.)

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

Desativando o STRICT

Habilitando o STRICT