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

#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:

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