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

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

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

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

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

or

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

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

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


person Jorge Ferreira    schedule 09.10.2008    source источник


Ответы (4)


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

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

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

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

person Michael Burr    schedule 09.10.2008

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

person Rob Walker    schedule 10.10.2008
comment
Stucts также различаются по размеру в разных версиях ОС. Я только что столкнулся с ошибкой, используя пакет sdk для платформы, поставляемый с VC++ 2008. Мы неправильно определили версию ОС и в итоге использовали версию структуры для Vista, которая не так хорошо работала на моем компьютере с XP. - person Aardvark; 10.10.2008

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

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

person jussij    schedule 10.10.2008

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

person Hafthor    schedule 09.10.2008