Прочитать на английском

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


Строгое соответствие требованиям

Некоторый исходный код, который успешно компилируется, может привести к возникновению сообщений об ошибках при включении проверки типа 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, ..., ...);

Параметр CreateWindow и Параметр CreateWindowExhmen u иногда используется для передачи целочисленного идентификатора элемента управления (ID). В этом случае необходимо привести идентификатор к типу 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 HINSTANCE, но есть несколько функций, которые возвращают или принимают только типы HMOD ULE.

отключение СТРОГИХ

включение СТРОГИХ

 

 


Дополнительные ресурсы