Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.08;
Скачать: CL | DM;

Вниз

Прочита в хелпе про stdcall и др. дериктивы и ничё не понял,   Найти похожие ветки 

 
iNew   (2002-07-26 18:19) [0]

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


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

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

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


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

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


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

:o)

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


 
ZZ ©   (2002-07-26 18:47) [4]

Может чего полезного найдешь (это с 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 Вам гарантирован.


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

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


 
ZZ ©   (2002-07-26 19:18) [6]

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


 
GrayFox ©   (2002-07-26 19:19) [7]

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


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

Да вот нашел исходник рисования "резиновой" линии хочу разобраться.
Исходник:
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 и др. обопбатываем.


 
y-soft ©   (2002-07-27 20:14) [9]

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

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

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


 
y-soft ©   (2002-07-27 20:17) [10]

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


 
Anatoly Podgoretsky ©   (2002-07-27 20:28) [11]

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


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

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

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

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


 
SoftOne ©   (2002-07-28 02:51) [13]

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2002.08.08;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
1-24075
LexusR
2002-07-26 07:43
2002.08.08
COM-объект умирает раньше времени


1-24095
ValeX
2002-07-17 17:19
2002.08.08
надо нечто StrToArray


1-24031
DeMoN-777
2002-07-29 09:30
2002.08.08
Получение короткого имени файла


3-23854
RDA
2002-07-16 11:14
2002.08.08
Изучая SQL - NEW и OLD


7-24254
Alex_MIB2
2002-05-22 21:22
2002.08.08
Как отправить на печать имеющийся *.тхт файл?