Поделиться через


Соответствие STRICT

Некоторый исходный код, который успешно компилируется, может выдавать сообщения об ошибках при включенной проверке типа STRICT . В следующих разделах описаны минимальные требования для компиляции кода, если включен параметр STRICT . Рекомендуется выполнить дополнительные действия, особенно для создания переносимого кода.

Общие требования

Основное требование заключается в том, что необходимо объявлять правильные типы дескрипторов и указатели функций, а не полагаться на более общие типы. Нельзя использовать один тип дескриптора там, где ожидается другой. Это также означает, что может потребоваться изменить объявления функций и использовать дополнительные приведения типов.

Для достижения наилучших результатов универсальный тип HANDLE следует использовать только при необходимости.

Объявление функций в приложении

Убедитесь, что объявлены все функции приложения. Рекомендуется размещать все объявления функций во включаемый файл, так как вы можете легко сканировать объявления и искать типы параметров и возвращаемых значений, которые следует изменить.

Если вы используете параметр компилятора /Zg для создания файлов заголовков для функций, помните, что результаты будут отличаться в зависимости от того, включена ли проверка типа STRICT . Если параметр STRICT отключен, все типы дескрипторов создают один и тот же базовый тип. При включенной функции STRICT они создают различные базовые типы. Чтобы избежать конфликтов, необходимо повторно создавать файл заголовка при каждом включении или отключении STRICT или изменять файл заголовка, чтобы вместо базовых типов использовались типы HWND, HDC, HANDLE и т. д.

Все объявления функций, скопированные из Windows.h в исходный код, могут быть изменены, а локальное объявление может быть устаревшим. Удалите локальное объявление.

Типы, требующие приведения

Некоторые функции имеют универсальные типы возвращаемых значений или параметры. Например, функция SendMessage возвращает данные, которые могут быть любого количества типов в зависимости от контекста. При отображении любой из этих функций в исходном коде убедитесь, что используется правильный приведение типа и что он максимально специфичен. Ниже приведен пример этих функций.

При вызове SendMessage, DefWindowProc или SendDlgItemMessage необходимо сначала привести результат к типу UINT_PTR. Аналогичные действия необходимо выполнить для любой функции, возвращающей значение LRESULT или LONG_PTR , где результат содержит дескриптор. Это необходимо для написания переносимого кода, так как размер дескриптора зависит от версии Windows. Приведение (UINT_PTR) обеспечивает правильное преобразование. В следующем коде показан пример, в котором SendMessage возвращает дескриптор кисти:

HBRUSH hbr;

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

Для передачи целочисленного идентификатора элемента управления иногда используются параметры hmenuCreateWindow и CreateWindowEx. В этом случае необходимо привести идентификатор к типу 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);

Дополнительные сведения

Чтобы получить максимальную выгоду от проверки типа STRICT , следует следовать дополнительным рекомендациям. Если вы внесете следующие изменения, код будет более переносимым в будущих версиях Windows.

Типы WPARAM, LPARAM, LRESULT и LPVOID являются полиморфными типами данных. Они хранят различные типы данных в разное время, даже если включена проверка типа STRICT . Чтобы получить преимущества проверки типов, необходимо как можно скорее привести значения этих типов. (Обратите внимание, что средства взлома сообщений автоматически перенаправляют wParam и lParam в переносимом виде.)

Уделите особое внимание различанию типов HMODULE и HINSTANCE . Даже если параметр STRICT включен, они определяются как один и тот же базовый тип. Большинство функций управления модулями ядра используют типы HINSTANCE , но есть несколько функций, которые возвращают или принимают только типы HMODULE .

Отключение STRICT

Включение STRICT