Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Директивы вызовов функций, Может кто объяснит 
:(
    Опции темы
Vit
Дата 26.9.2002, 05:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Может кто объяснит подробнее  особенности применения директив вызовов процедур: register, pascal, cdecl, stdcall, safecall. В чём отличия, когда и какие надо применять, какие преимущества и недостатки?


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
FdX
Дата 26.9.2002, 06:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 13.8.2002

Репутация: нет
Всего: нет



Разница в способе передачи параметров в функцию и возврата параметров из функции.

stdcall - юзается (вроде) а винапях. Передача аргументов справа налево. Стек очищает вызываемая процедура. Возвращает разультат в EAX (помойму)

pascal - юзалось в вин16апи. Передача в аргументов слева направо. Стек очищает вызываемая. В паскале результат возвращался в al, ax или в dx:ax. Как в дельфи - не помню, вероятно а EAX.

register - передача всего через регистры проца. Как именно - зависит от компилера.

cdecl - не помню. Вроде тоде, что и  stdcall, только стек чистит вызываюзая процедура

Про safecall не знаю. Может ее еще както называют?
Есть еще fastcall, но там что я не помню. Если знаешь асм, можешь написать прогу с таким вызовом функции и посмотреть в отладчике. Я тогда завтра скажу про нее.
PM MAIL ICQ   Вверх
Dapo
Дата 26.9.2002, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 18.4.2002

Репутация: нет
Всего: 1



sdecl - вызовы в стиле С (для обращения к длл использующим соглашения о вызовах в стиле С). Параметры в сет с права на лево. Очистка  - вызывающей процедурой. Обеспечивают обслуживание переменного числа параметров.
PM MAIL   Вверх
MBo
Дата 27.9.2002, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 10.6.2002

Репутация: 3
Всего: 18



PM MAIL   Вверх
Chingachguk
Дата 27.9.2002, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Цитата

Vit Дата сообщения: 25.9.2002,22:40
[...]
В чём отличия, когда и какие надо применять, какие преимущества и недостатки?


Эти директивы скорее относятся к способу(ам) реализации вызовов процедур и передачи (примему от) параметров на конкретном машинном языке при компилляции с языков высокого уровня.

Так, например в DOS СИ использовали свои виды реализаций(обычно называемые C-call), а Паскаль - свой. В win32 также различаются реализации для этих языков, но постепенно происходит заимствование фрагментов реализаций друг у друга и их симбиозы (stdcall).

Если ты пишешь только на одном языке и не подключаешь внешних библиотек, созданных другим компиллятором (в другом формате), то тебе, в принципе, все равно, какая реализация используется - компиллятор сам примет верное решение и согласует вызовы подпрограмм в своем стиле. Исключение, пожалуй, составляет лишь опция "registers" - по смыслу это означает приоритетное использование регистров процессора для передачи(получения) данных процедуре. Как правило, это ускоряет вызов процедуры и возврат из нее: может быть использования для повышения быстродействия. Однако это обычно делают установкой глобального флага проекта в момент создания Файнал Релиз, применяя это сразу ко всем подпрограммам.

Однако если тебе необходимо подключить внешнюю библиотеку (например, написанный на СИ dll, вызывающий в свою очередь апи sql-сервера), то будет необходимо учесть способ передачи параметров именно этой библиотеке.

Или при явном вызове win api из кода также нужно учесть способ их вызова (stdcall)...


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Vit
Дата 27.9.2002, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Спасибо всем, особенно MBo - его ответы всегда исчерпывающие!


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Vit
Дата 27.9.2002, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Цитата(Chingachguk @ 27.9.2002, 05:39)
Если ты пишешь только на одном языке и не подключаешь внешних библиотек, созданных другим компиллятором (в другом формате), то тебе, в принципе, все равно, какая реализация используется - компиллятор сам примет верное решение и согласует вызовы подпрограмм в своем стиле.

Меня больше интересует разрез, чтобы написанные мной на Дельфи DLL могли работать в других програмных средах. Как я понял из всего выше изложенного надо применять stdcall как наиболее стандартный...


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Chingachguk
Дата 27.9.2002, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Тут говорят, что все вин-dll имеют единый формат точек входа (т.е.) public-функций и, если ты делаешь ее где угодно, то из ее можно вызывать ф-ции(как из dll) из любых других языков. Т.е. в первом приближении ничего делать не нужно. Судя по тому, что я делал - формат вызова как раз stdcall.
Другое дело - внутренние функции самой dll. Их формат может быть каким угодно, в том числе и тот, который используется компиллятором по умолчанию...


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0484 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.