Форум: "Начинающим";
Текущий архив: 2008.11.16;
Скачать: [xml.tar.bz2];
ВнизЗачем у сишных структур есть поле Size? Найти похожие ветки
← →
TStas © (2008-10-09 14:48) [0]Речь идёт о структурах, которые нужно заполнять при вызове API-функций, а в поле Size нужно писать размер структуры. А зачем так сджелано? Ведь размер структуры и так известен компилятору? Я сам пробовал, если в это поле написать что-то неправильное, ничего не работает, а структура не заполняется. Но почему?
← →
Ega23 © (2008-10-09 14:53) [1]
type
TMyType = record
Buff : Pointer;
BuffSize : Integer;
end;
← →
TStas © (2008-10-09 15:00) [2]Да, но в поле Size у сишных структур нужно помещать именно размер структуры, поля которой заполняет API - ф-ция. Я написат SizeOf(...) и сразу всё заработало. Это именно не буфер неведомой длинные, а запись со своими полями, которые заполняет вызываемая ф-ция. Совершенно точно, так делается у DrawTextEx, но и у многих других подобных сишных структур надо передавать в структуру её же собственный размер, причём везде поле, содержащее размер структуры, в описании идёт первым, то есть указатель на структуру, передаваемый в ф-цию, фактически указывает на это поле.
← →
Palladin © (2008-10-09 15:03) [3]
> TStas © (09.10.08 15:00) [2]
это не "сишные структуры", для функций WinAPI, это просто указатели на какие-то данные передаваемые в функцию WinAPI, поле, отвечающее за размер передаваемой структуры данных, является одной из защиты от дураков которые могут передавать полный бред. так же это поле может служить валидации данных для разных реализаций вызываемой функции.
← →
TStas © (2008-10-09 15:11) [4]Ну вот, теперь понятно.
← →
tesseract © (2008-10-09 15:22) [5]
> так же это поле может служить валидации данных для разных
> реализаций вызываемой функции.
Многие функции, ежели туда пустой параметр передать возвращают размер, чего они там хотя вернуть. Полезно.
← →
Palladin © (2008-10-09 15:23) [6]кстати, да, иногда очень полезно
← →
TStas © (2008-10-09 16:59) [7]То есть, они сами туда пишут, чего возвращают? Наверно, это полезно. Просто меня удивило, что это структура, размер которой заведомо известен. Первый раз - ладно, но когда читал книжку, увидел ещё папру таких же, а у всех на первом месте стоит размер. Вот и решил спросить. Причем в книжке было написано, что "передадим туда SizeOf(...)"., вот меня и удивило, ну, зачем же в структуру ейный размер передавать. Я подумал, может, это какая-то сишная заморочка. Ведь в сях массив не самоопределён, а является константой-указателем на первый евонный элемент. Я вот и подумал, что, возможно, что-то вроде этого, чего я просто не знаю. Ведь API-ф-ции на сях написаны.
← →
Palladin © (2008-10-09 17:05) [8]
> То есть, они сами туда пишут, чего возвращают?
Это относится в основном к функциям, которые возвращают, а не принимают данные. Но не все функции такие хорошие.
← →
Palladin © (2008-10-09 17:09) [9]И даже в рамках одного раздела (категорий функций API) некоторые могут возвращать, некоторые тупо возвещать об ошибке, хотя я думаю в этом не MS виновата в основном. Особенно в этом отношении мною очень любим раздел CryptoAPI. Бо многие функции в нем в основном транслируются на вызов криптопровайдерских, которые запросто могут наплевать на возвращение размера. Особенно я люблю в этом отношении функцию CryptEncode отрабатывающую с провайдером CryptoPRO :)
← →
Юрий Зотов © (2008-10-09 17:24) [10]> TStas © (09.10.08 16:59) [7]
> это структура, размер которой заведомо известен.
Не очень-то он и известен. Изменилась версия, состав полей структуры стал другим, изменился ее размер - и у юзера все упало. Юзер же не может свой экземпляр АПИшной DLL перекомпилировать.
А так - DLL всегда знает, что 4 байта по адресу структуры содержат ее размер. Мудро сделано.
← →
Palladin © (2008-10-09 17:27) [11]
> Мудро сделано.
очень
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.11.16;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c