Какова цель члена cbSize в структурах Win32API - PullRequest
8 голосов
/ 10 октября 2008

Я часто сталкиваюсь с некоторыми определениями структур 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?

Ответы [ 4 ]

12 голосов
/ 10 октября 2008

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

11 голосов
/ 10 октября 2008

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

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

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

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

3 голосов
/ 10 октября 2008

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

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

1 голос
/ 10 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...