Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Прочита в хелпе про stdcall и др. дериктивы и ничё не понял, [D5, D6, Win95/98]


iNew ©   (2002-07-26 18:19:00) 

может кто раскажет по подробнее, или даст ссылку где можно почитать.


Слесарь Матерящийся   (2002-07-28 04:28:00) [1]

>>>SoftOne
Да. Если это действительно НУЖНО данному кадру :)


SoftOne   (2002-07-28 02:51:00) [2]

> Слесарь Матерящийся (27.07.02 23:37)
Действительно МОЖНО ПОПРОБОВАТЬ ИСПОЛЬЗОВАТЬ, но лучше, все-таки, понять суть деклараций и разницу между ними.


Слесарь Матерящийся   (2002-07-27 23:37:00) [3]

Можно использовать правило:

Внутри модуля (dll,exe) все вызовы -- fastcall
То, что "на экспорт" -- stdcall
Соответственно, "импорт" -- тоже stdcall

почему, долго объяснять. Примите как есть. И не запутаетесь!


Anatoly Podgoretsky   (2002-07-27 20:28:00) [4]

iNew (26.07.02 18:57)
Смысла нет, это просто соглашение и грехи разработчиков компиляторов
Об остальных соглашениях можно постмотреть в справочной системе Дельфи по теме Calling conventions


y-soft   (2002-07-27 20:17:00) [5]

Пардон, слэш в закрывающем теге не поставил :)


y-soft   (2002-07-27 20:14:00) [6]

В приведенном примере вызывается функция WinApi LineDDA, которая в качестве параметра требует указатель на функцию, использующую соглашение stdcall, а в Delphi по умолчанию используется fastcall. Поэтому LineDrawRGBтак определена.

Приведенный ZZ © (26.07.02 18:47)большой пример в общем-то не совсем в тему. Проще было сказать, что спецификация соглашения о вызове определяет, каким образом будут передаваться в вызываемую функцию параметры, и как будут освобождаться ресурсы. Эта информация нужна компилятору и при программировании на ассемблере

Грубо говоря, если использовать неправильное соглашение о вызове, то программа просто наглухо зависнет


iNew   (2002-07-26 19:22:00) [7]

Да вот нашел исходник рисования "резиновой" линии хочу разобраться.
Исходник:
procedure LineDrawRGB(X,Y:Integer;Canvas:TCanvas);stdcall;
// Линия, состоящая из чередующихся отрезков по пять точек красного, зелёного и
// синего цветов.
begin
case Counter mod 15 of
0..4:Canvas.Pixels[X,Y]:=clRed;
5..9:Canvas.Pixels[X,Y]:=clLime;
10..14:Canvas.Pixels[X,Y]:=clBlue
end;
Inc(Counter);
end;

procedure TForm1.Line;
//var Angle:Extended;
begin
case RGroupLine.ItemIndex of
0:begin
Counter:=0;
LineDDA(X1,Y1,X2,Y2,@LineDrawRGB,Integer(Canvas))
end;
end;
Ну и потом в событиях Mousemove и др. обопбатываем.


GrayFox   (2002-07-26 19:19:00) [8]

что-то связанное с порядком записи данных в стек


ZZ   (2002-07-26 19:18:00) [9]

А с какой целью вообще интересуешся?


iNew   (2002-07-26 18:57:00) [10]

А в чём смысл передачи параметров спрва налево?


ZZ   (2002-07-26 18:47:00) [11]

Может чего полезного найдешь (это с rsdn.ru)

__stdcall - это ключевое слово языка С++, оно, в частности, влияет на механизм передачи параметров функции. Суть механизма, определяемого __stdcall состоит в том, что 1) аргументы передаются справа налево; 2) аргументы из стека выбирает вызываемая функция; 3) аргументы передаются по значению (by value), а не по ссылке (by reference), т.е. функции передаются копии переменных; 4) определяет соглашение по декорированию имени функции, т.е. включению в имя дополнительной информации, используемой компоновщиком; 5) регистр символов не изменяется.
То есть оказалось, что WINAPI - это не вовсе тип, а указание о том, что функция использует соглашение __stdcall. Кстати, имейте в виду, что описатель PASCAL и __pascal - это то же самое, что и WINAPI. Но этот описатель является устаревшим, оставлен лишь для совместимости, и Microsoft рекомендует повсеместно использовать вместо него WINAPI.

Использование соглашения __сdecl вместо __stdcall иногда оправданно, но приводит к увеличению размера исполняемого модуля из-за того, что имя функции декорируется в этих соглашениях по-разному.

--------------------------------------------------------
Публикация "WinAPI: Не запутайтесь в типах", вышедшая в предыдущем выпуске (и которая, кстати, будет продолжена в следующем) вызвала некоторый резонанс из-за допущенных там двух неточностей.

Здравствуйте, Алекс!

Встретил в Вашей рассылке "Программирование на Visual C++" за No.5 следующее утверждение:

"Кстати, имейте в виду, что описатель PASCAL и __pascal - это то же самое, что и WINAPI. Но этот описатель является устаревшим, оставлен лишь для совместимости, и Microsoft рекомендует повсеместно использовать вместо него WINAPI."

Это распространенное мнение, которое вызвано переходом Microsoft с __pascal на __stdcall при переходе с Win16 на Win32. При этом Microsoft в MSDN утверждает, что: "Use WINAPI where you previously used PASCAL or __far __pascal." Но это означает всего лишь то, что стандартный способ вызова API функций изменился, а не то, что __pascal эквивалентен __stdcall. Проиллюстрируем это первоисточниками.

MSDN:

"The __stdcall calling convention is used to call Win32 API functions. Argument-passing order Right to left. Argument-passing convention By value, unless a pointer or reference type is passed. Stack-maintenance responsibility Called function pops its own arguments from the stack. "

Borland C++ Builder Help:

"In addition, __pascal declares Pascal-style parameter-passing conventions when applied to a function header (parameters pushed left to right; the called function cleans up the stack)."

Справка от Борландовского продукта в последнем случае выбрана потому, что MSDN вообще умалчивает о том, кто такой этот __pascal, ограничиваясь тем, что он is now obsolete. Из вышеприведенных выдержек мы можем видеть, что __stdcall отличается от __pascal порядком передачи параметров. И просто так подменять один способ другим нельзя. Это легко продемонстрировать, попытавшись вызвать функцию с модификатором __pascal из Visual Basic. Access Violation Вам гарантирован.


Странный Прохожий   (2002-07-26 18:29:00) [12]

:o)

Тогда можно через yandex поискать...


iNew   (2002-07-26 18:28:00) [13]

а чтоб по русски?


Странный Прохожий   (2002-07-26 18:26:00) [14]

http://msdn.microsoft.com/library/en-us/vclang/html/_core_Argument_Passing_and_Naming_Conventions.asp

там достаточно подробно


Наверх

Титульная страница Поиск, карта сайта Написать письмо