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

Вниз

Порядок вызова в прототипах функций   Найти похожие ветки 

 
Michael   (2009-07-02 21:14) [0]

Доброго времени суток!
При написании библиотек обычно указывал порядок передачи параметров через stdcall.
На днях потребовалось сделать прототипы функций, типа:
function ExampleFunction (AValue: BYTE; BValue: BYTE) : BYTE; virtual; abstract;
Так вот, компилятор ругается, если после этого указать порядок вызова параметров. Почему? Даже если я потом при реализации override-дну ее, почему не имею права в прототипе указать порядок вызова?
Спасибо.


 
palva ©   (2009-07-02 21:41) [1]

Нужно написать, какими словами ругается. И написать версию компилятора, чтоб люди могли попробовать.

Я бы попробовал написать abstract в самом конце.


 
Сергей М. ©   (2009-07-02 21:45) [2]

stdcall - это не только порядок передачи параметров..

> На днях потребовалось .. компилятор ругается, если после этого указать


А зачем потребовалось-то ?
Вразумительно можешь ли  объяснить сию идею-фикс ?


 
Michael   (2009-07-02 22:15) [3]


> Нужно написать, какими словами ругается. И написать версию
> компилятора, чтоб люди могли попробовать.Я бы попробовал
> написать abstract в самом конце.

[Error] ...: Field definition not allowed after methods or properties
Версию компилятора в D7 где смотреть?


> А зачем потребовалось-то ?Вразумительно можешь ли  объяснить
> сию идею-фикс ?

Имеем файл-описатель, где описываем объект со всеми его методами и свойствами, а реализацию этого объекта отдаем библиотеке, которая может быть написана в том числе и на С. Для избежания коллизий при вызове функций из библиотеки, хотелось бы точно знать, что порядок передачи параметров совпадает.


 
Игорь Шевченко ©   (2009-07-02 22:23) [4]

Michael   (02.07.09 22:15) [3]


> а реализацию этого объекта отдаем библиотеке, которая может
> быть написана в том числе и на С.


Любопытно, как ты собираешься экспортировать класс в Delphi. Сдается мне, что никак.


 
Игорь Шевченко ©   (2009-07-02 22:33) [5]

Удалено модератором
Примечание: Дубль


 
Юрий Зотов ©   (2009-07-02 22:41) [6]

> Michael   (02.07.09 22:15) [3]

> [Error] ...: Field definition not allowed after methods or properties

Все поля объекта должны быть объявлены ПЕРЕД объявлением его свойств и методов. Возможно, это совсем другая ошибка, а stdcall вовсе и ни при чем?


 
Michael   (2009-07-02 23:15) [7]


> Любопытно, как ты собираешься экспортировать класс в Delphi.
>  Сдается мне, что никак.

Не совсем понял вопрос. Если имеется ввиду, как получить экземпляр класса, реализованного в библиотеке, то можно просто написать функцию, возвращающую TObject, а потом привести его к тому типу класса, который нужен.

> Все поля объекта должны быть объявлены ПЕРЕД объявлением
> его свойств и методов. Возможно, это совсем другая ошибка,
>  а stdcall вовсе и ни при чем?

Тем не менее, если функция в объекте указывается, как в первом посте, всё нормально. Если abstract; добавить stdcall; - ругается...


 
Игорь Шевченко ©   (2009-07-03 00:31) [8]

Michael   (02.07.09 23:15) [7]


> Не совсем понял вопрос. Если имеется ввиду, как получить
> экземпляр класса, реализованного в библиотеке, то можно
> просто написать функцию, возвращающую TObject, а потом привести
> его к тому типу класса, который нужен.


Я несколько про другое. Как известно, run-time packages, кроме экспорта собственно методов, экспортируют еще и тип (ту самую vmt) для класса, в частности, с адресами виртуальных методов. У приложения своя vmt, у библиотеки - своя. Из-за наличия двух копий порой происходят странные и необъяснимые явления (это при условии, что и приложение и dll написаны на delphi и формат vmt для ОДНОЙ И ТОЙ ЖЕ версии delphi совпадает).
Откуда библиотека,  написанная на С, узнает, что набор методов, реализованных в ней, должны соответствовать формату vmt в приложении на delphi, мне вообще представляется с трудом.

По-моему, проще через COM работать в этом случае - там все эти хитрости на себя система берет. Или делать в приложении на delphi переходник-заглушки для наследников классов, которые будут вызывать функции библиотеки, написанной на каком угодно языке, но уже по стандартным соглашениям о вызовах.


 
Сергей М. ©   (2009-07-03 08:25) [9]


> Michael   (02.07.09 22:15) [3]


Ясно.
Вот так будет правильно:

TMyObject = class(TObject)
 procedure MyMethod; virtual; stdcall; abstract;
end;

TMyObject1 = class(TMyObject)
 procedure MyMethod; override; stdcall;
end;


Только вот с экспортом дельфийского класса из библиотеки ты ерунду затеял, тебе правильно говорят.
В гетерогенной среде для оной цели следует использовать COM


 
Michael   (2009-07-03 13:46) [10]

Большое спасибо.



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

Форум: "Начинающим";
Текущий архив: 2009.08.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.004 c
15-1246566925
Юрий
2009-07-03 00:35
2009.08.30
С днем рождения ! 3 июля 2009 пятница


15-1246212338
vuk
2009-06-28 22:05
2009.08.30
Москва. Печать на цветном лазернике. Где?


15-1246084179
@!!ex
2009-06-27 10:29
2009.08.30
KVM с автоматическим переключением мышки


15-1246342790
Холивар
2009-06-30 10:19
2009.08.30
Библиотеки DirectX


15-1246568526
Kostafey
2009-07-03 01:02
2009.08.30
Наклепал пару заметок про EMaxima





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