#c #winapi #api
Вопрос:
Я часто сталкиваюсь с некоторыми определениями структур Win32API (но не ограничиваясь ими), которые имеют cbSize
элемент, как в следующем примере.
typedef struct _TEST {
int cbSize;
// other members follow
} TEST, *PTEST;
А потом мы используем его вот так:
TEST t = { sizeof(TEST) };
...
или
TEST t;
t.cbSize = sizeof(TEST);
...
Мое первоначальное предположение состоит в том, что это потенциально может быть использовано для управления версиями. Библиотека DLL, получающая указатель на подобную структуру, может проверить, имеет ли cbSize
элемент ожидаемое значение, с которым была скомпилирована библиотека DLL. Или проверить, правильно ли упакована конструкция. Но я хотел бы услышать это от вас.
Какова цель cbSize
элемента в некоторых структурах C в Win32API?
Ответ №1:
Он используется для управления версиями. Хорошим примером является вызов GetVersionEx. Вы можете передать либо OSVERSIONINFO, либо OSVERSIONINFOEX. OSVERSIONINFOEX является надмножеством OSVERSIONINFO, и единственный способ, которым ОС знает, какой вы передали, — это член dwOSVersionInfoSize.
Комментарии:
1. Штукатурки также различаются по размеру в разных версиях ОС. Я только что обнаружил ошибку, используя sdk платформы, который поставляется с VC 2008. Мы неправильно определили версию операционной системы и в итоге использовали версию структуры Vista, которая не очень хорошо работала на моей коробке XP.
Ответ №2:
Мое первоначальное предположение состоит в том, что это потенциально может быть использовано для управления версиями.
Это одна из причин. Я думаю, что это более обычное.
Другой вариант-для структур с данными переменной длины.
Я не думаю, что проверка правильной упаковки или ошибок в вызывающем абоненте является конкретной причиной этого, но это будет иметь такой эффект.
Ответ №3:
Это также позволяет WIN32 API выполнять минимальную проверку работоспособности передаваемых данных.
Например, ошибка commom заключается в том, что структура WIN32 передается с неправильным или неинициализированным размером cbSize, и когда это происходит, WIN32 API обычно просто возвращает неудачный результат, а не пытается обработать то, что кажется поврежденными данными.
Ответ №4:
Частично управление версиями, в основном безопасность… чтобы предотвратить проникновение вызываемой функции в память, которая не была частью переданной структуры.