Форум: "Основная";
Текущий архив: 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