Compartir a través de


Cumplimiento estricto

Algún código fuente que se compila correctamente podría producir mensajes de error al habilitar la comprobación de tipos STRICT . En las secciones siguientes se describen los requisitos mínimos para que el código se compile cuando STRICT está habilitado. Se recomiendan pasos adicionales, especialmente para generar código portátil.

Requisitos generales

El requisito principal es que debe declarar los tipos de identificador y punteros de función correctos en lugar de confiar en tipos más generales. No se puede usar un tipo de identificador donde se espera otro. Esto también significa que es posible que tenga que cambiar las declaraciones de función y usar más conversiones de tipos.

Para obtener los mejores resultados, el tipo HANDLE genérico solo se debe usar cuando sea necesario.

Declaración de funciones dentro de la aplicación

Asegúrese de que se declaran todas las funciones de aplicación. Se recomienda colocar todas las declaraciones de función en un archivo de inclusión porque puede examinar fácilmente las declaraciones y buscar los tipos de parámetro y valor devuelto que se deben cambiar.

Si usa la opción del compilador /Zg para crear archivos de encabezado para las funciones, recuerde que obtendrá resultados diferentes en función de si ha habilitado la comprobación de tipos STRICT . Con STRICT deshabilitado, todos los tipos de identificador generan el mismo tipo base. Con STRICT habilitado, generan diferentes tipos base. Para evitar conflictos, debe volver a crear el archivo de encabezado cada vez que habilite o deshabilite STRICT, o edite el archivo de encabezado para usar los tipos HWND, HDC, HANDLE, etc., en lugar de los tipos base.

Es posible que las declaraciones de función que copió de Windows.h en el código fuente hayan cambiado y la declaración local no esté actualizada. Quite la declaración local.

Tipos que requieren conversiones

Algunas funciones tienen parámetros o tipos de valor devuelto genéricos. Por ejemplo, la función SendMessage devuelve datos que pueden ser cualquier número de tipos, en función del contexto. Cuando vea cualquiera de estas funciones en el código fuente, asegúrese de usar la conversión de tipos correcta y de que sea lo más específica posible. La lista siguiente es un ejemplo de estas funciones.

Al llamar a SendMessage, DefWindowProc o SendDlgItemMessage, primero debe convertir el resultado en el tipo UINT_PTR. Debe realizar pasos similares para cualquier función que devuelva un valor LRESULT o LONG_PTR , donde el resultado contiene un identificador. Esto es necesario para escribir código portátil porque el tamaño de un identificador varía, en función de la versión de Windows. La conversión (UINT_PTR) garantiza una conversión adecuada. En el código siguiente se muestra un ejemplo en el que SendMessage devuelve un identificador a un pincel:

HBRUSH hbr;

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

El parámetro CreateWindow y CreateWindowExhmenu se usa a veces para pasar un identificador de control entero (ID). En este caso, debe convertir el identificador en un 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);

Consideraciones adicionales

Para obtener la mayor ventaja de la comprobación de tipos STRICT , hay instrucciones adicionales que debe seguir. El código será más portátil en versiones futuras de Windows si realiza los siguientes cambios.

Los tipos WPARAM, LPARAM, LRESULT y LPVOID son tipos de datos polimórficos. Contienen diferentes tipos de datos en momentos diferentes, incluso cuando está habilitada la comprobación de tipos STRICT . Para obtener la ventaja de la comprobación de tipos, debe convertir los valores de estos tipos lo antes posible. (Tenga en cuenta que los descifradores de mensajes vuelven a retransmiter automáticamente wParam y lParam de forma portátil).

Tenga especial cuidado para distinguir los tipos HMODULE e HINSTANCE . Incluso con STRICT habilitado, se definen como el mismo tipo base. La mayoría de las funciones de administración de módulos kernel usan tipos HINSTANCE , pero hay algunas funciones que devuelven o aceptan solo tipos HMODULE .

Deshabilitar STRICT

Habilitación de STRICT