Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.48 MB
Время: 0.006 c
2-1223369428
JustI
2008-10-07 12:50
2008.11.16
RowsAffected


4-1200427210
owa
2008-01-15 23:00
2008.11.16
Как по имени exe-файла узнать его процесс?


15-1221740044
Jeer
2008-09-18 16:14
2008.11.16
Геометрическое мышление


2-1223495398
АгатаКристи
2008-10-08 23:49
2008.11.16
IP, Основной Шлюз, DNS


2-1222950578
Brabus
2008-10-02 16:29
2008.11.16
Проверка существования поля в таблице





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский