Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.30;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
15-1246464115
Pashka.cool
2009-07-01 20:01
2009.08.30
Проблема с режимом отладки в самой среде!!!!!!


3-1226395215
GRAND
2008-11-11 12:20
2009.08.30
cxGrid6 - Access Violation


2-1245711399
Снегурочка
2009-06-23 02:56
2009.08.30
Передача данных Tcp/ip


4-1215247210
denissoft
2008-07-05 12:40
2009.08.30
kiFastSystemCallRet


3-1226507367
DOjD
2008-11-12 19:29
2009.08.30
Работа с ZQuery LOCAL