Какова цель члена 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 обычно просто возвращает неудачный результат, а не пытается обработать то, что кажется поврежденными данными.
частично управление версиями, в основном безопасность... чтобы предотвратить проникновение вызываемой функции в память, которая не была частью переданной структуры.