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