Какова цель члена cbSize в структурах Win32API

Я часто сталкиваюсь с некоторыми определениями для структур Win32API (но не ограничиваясь этим), которые имеют cbSize member как в следующем примере.

typedef struct _TEST {
    int cbSize;
    // other members follow
} TEST, *PTEST;

и тогда мы используем его так:

TEST t = { sizeof(TEST) };
...

или

TEST t;
t.cbSize = sizeof(TEST);
...

мое первоначальное предположение, что это может быть использовано для управления версиями. DLL, которая получает указатель для такой структуры, может проверить, если cbSize member имеет ожидаемое значение, с которым была скомпилирована DLL. Или проверить если правильная упаковка сделана для структуры. Но я хотел бы услышать это от вас.

какова цель cbSize член в некоторых структурах C++ на Win32API?

4 ответов


мое первоначальное предположение, что это может потенциально может использоваться для управления версиями.

Это одна из причин. Я думаю, это более обычное.

другое для структур, которые имеют данные переменной длины.

Я не думаю, что проверка правильной упаковки или ошибок в вызывающем абоненте является конкретным аргументом, но это будет иметь такой эффект.


используется для управления версиями. Хороший пример -GetVersionEx звонок. Вы можете пройти в OSVERSIONINFO или OSVERSIONINFOEX. OSVERSIONINFOEX-это надмножество OSVERSIONINFO, и единственный способ, которым ОС знает, что вы передали, - это член dwOSVersionInfoSize.


Он также позволяет WIN32 API сделайте минимальный объем проверки вменяемости на передаваемых данных.

например, ошибка commom для в Win32 структура, которая будет передана с неправильно или неинициализированное cbSize и когда это происходит WIN32 API обычно просто возвращает неудачный результат, а не пытается обработать то, что кажется поврежденными данными.


частично управление версиями, в основном безопасность... чтобы предотвратить проникновение вызываемой функции в память, которая не была частью переданной структуры.