Conformidade ESTRITA
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 ser compilado quando STRICT está habilitado. Etapas adicionais são recomendadas, especialmente para produzir código portátil.
Requisitos gerais
O principal requisito é 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 seja 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 de HANDLE de 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 verificação de tipo de STRICT. Com STRICT desabilitado, todos os tipos de identificador geram o mesmo tipo base. Com STRICT habilitados, eles geram tipos base diferentes. 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 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 genéricos ou parâmetros. 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 no código-fonte, certifique-se de usar a conversão de tipo correta e se ela é o mais específica possível. A lista a seguir é um exemplo dessas funções.
- localLock
- GlobalLock
- GetWindowLong
- SetWindowLong
- SendMessage
- DefWindowProc
- SendDlgItemMessage
Ao chamar SendMessage, DefWindowProcou SendDlgItemMessage, primeiro você deve converter o resultado para digitar UINT_PTR. Você precisa executar etapas semelhantes para qualquer função que retorne um LRESULT ou LONG_PTR valor, em que o resultado contém um identificador. Isso é necessário para escrever código portátil porque o tamanho de uma alça 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, ..., ...);
O parâmetro CreateWindow e CreateWindowExhmenu às vezes é usado para passar um identificador de controle inteiro (ID). Nesse caso, você deve converter a ID em um tipo de 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 obter o maior benefício de verificação de tipo de 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 verificação de tipo de ESTRITA está habilitada. Para obter o benefício da verificação de tipo, você deve converter valores desses tipos assim que possível. (Observe que os biscoitos de mensagem recast automaticamente wParam e lParam para você de maneira portátil.)
Tome cuidado especial para distinguir tipos de HMODULE e HINSTANCE. Mesmo com STRICT habilitados, eles são definidos como o mesmo tipo base. A maioria das funções de gerenciamento de módulo de kernel usa tipos de HINSTANCE, mas há algumas funções que retornam ou aceitam apenas tipos de HMODULE.
Tópicos relacionados
-
desabilitando ESTrito
-
habilitando STRICT