Compartir vía


Cumplimiento ESTRICTO

Es posible que algún código fuente que se compile correctamente genere mensajes de error al habilitar STRICT comprobación de tipos. En las secciones siguientes se describen los requisitos mínimos para que el código se compile cuando se habilita STRICT. 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 de HANDLE genérico debe usarse solo 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 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 que 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 LRESULT o LONG_PTR valor, 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 CreateWindow y parámetro CreateWindowExhmenu a veces se usa para pasar un identificador de control entero (ID). En este caso, debe convertir el identificador en un 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);

Consideraciones adicionales

Para obtener la mayor ventaja de STRICT comprobación de tipos, 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, LRESULTy LPVOID son tipos de datos polimórficos. Contienen diferentes tipos de datos en momentos diferentes, incluso cuando se habilita 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 para usted de forma portátil).

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

deshabilitar STRICT

Habilitación de STRICT