Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.08.08;
Скачать: [xml.tar.bz2];

Вниз

Прочита в хелпе про 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.007 c
1-24098
V.Turecky
2002-07-26 15:23
2002.08.08
Загрузка из DLL ICO файла...


3-23908
alords
2002-07-18 09:14
2002.08.08
Query


7-24248
GreatMaster
2002-05-25 17:36
2002.08.08
Ыскейп команды для принтера или как обломать автопрогон страницы?


6-24154
ss18
2002-05-27 23:30
2002.08.08
Как написать КлиентСокет на АПИ?


1-23969
Arhangel
2002-07-25 15:47
2002.08.08
Иконки





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский