Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Подключение библиотеки к Pascal Scripts


_Mouse_ ©   (2007-02-16 11:59:00) 

Здраствуйте. Ситуация следующая. Использую скриптовый движок Pascal Scripts. Чтобы добавить в него ф-цию - надо ее зарегестрировать типа так:
Sender.AddFunction(@StrToTime, 'function StrToTime(const s: string): TDateTime;');
Хочу таким же способом использовать и при подключении ф-ций из библиотеки. Интерфейс определения ф-ций разработан. Библиотека будет динамически загружена.
Вопрос в другом:
Какой тип соглашения будет использоваться? (Библиотеки будут писаться как на паскале так и на Си)
Как правильно описать тип вызова ф-ций в библиотеке в моем случае? Желательно пример для Си.
Заранее спасибо.


Сергей М.   (2007-02-19 11:33:00) [1]


> Сергей М. ©   (19.02.07 11:31) [14]


+ и не всякий компилятор, поддерживающий это соглашение, обязан использовать его по дифолту, подобно Delphi


Сергей М.   (2007-02-19 11:31:00) [2]

Касаемо же register-соглашения - опять же следует уточнить С-компилятор, потому как хоть соглашение и стандартное, не всякий компилятор обязан его поддерживать.


Сергей М.   (2007-02-19 11:00:00) [3]


> DevilDevil ©   (16.02.07 17:39) [10]


> 1) какое соглашение поставишь, такое и будет. Паскаль не
> дураки делают.


Куда "поставишь"-то ? Изъясняйся конкретней...
Есть вызывающий код (интерпретируемый средствами некоего конкретного движка Паскаль-текст) и вызываемый код (код п/программы в составе библ-ки, разработанной в некоей C-среде). Ты о каком ?


> 2) по умолчанию fastcall (т.е. register)


Цитата из http://en.wikibooks.org/wiki/Reverse_Engineering/Calling_Conventions#FASTCALL:

FASTCALL

The FASTCALL calling convention is notcompletely standard across all compilers, so it should be used with caution. In FASTCALL, the first 2 or3 32-bit (or smaller) arguments are passed in registers, with the most commonly used registers being edx, eax, and ecx. Additional arguments, or arguments larger then 4-bytes are passed on the stack, oftenin Right-to-Left order (similar to CDECL)

Читать и вникать, до полного просветления.


> 3) невоторые короткие функции вставляются в код инлайнами;
>  однако сделай эту функцию экспотрируемой, всё "встанет
> на свои места"


Это к чему вообще ?

p.s.


> умничаете, умничаете, строите из себя всезнающего... а по
> поводу соглашений привераете (врёте) !


Где вру ?
Показывай ...


DevilDevil   (2007-02-17 20:16:00) [4]

> Ketmar ©   (17.02.07 11:52) [11]

Сбила! В пятом классе!

P.S. ходишь тут, выпендриваешься


Ketmar   (2007-02-17 11:52:00) [5]

> DevilDevil ©   (16.02.07 17:39) [10]
а ведь глупость -- она неизлечима... %-( скажи, ну как тебя до сих пор машина не сбила при переходе дороги?
*sigh*


DevilDevil   (2007-02-16 17:39:00) [6]

> Сергей М. ©   (16.02.07 12:34) [4]

Сергей, вот я заметил, Вы всё умничаете, умничаете, строите из себя всезнающего... а по поводу соглашений привераете (врёте) !

1) какое соглашение поставишь, такое и будет. Паскаль не дураки делают.
2) по умолчанию fastcall (т.е. register)
3) невоторые короткие функции вставляются в код инлайнами; однако сделай эту функцию экспотрируемой, всё "встанет на свои места"


Loginov Dmitry   (2007-02-16 17:24:00) [7]

> Это интерпретирующий движок, поэтому по идее он обязан сам
> заботиться о загрузке и выгрузке


Созданные в скрипте объекты он не обязан разрушать (и не разрушает). Тоже может быть и с выгрузкой библиотеки.


_Mouse_   (2007-02-16 13:46:00) [8]

Хмм ... интересно .... щас попробую.
Спасибо за подсказку :-)


Сергей М.   (2007-02-16 13:37:00) [9]


> не понятно что они хотят чтобы я указал в этой строке


Ну как что ?

Например, как следует из комментария, функцию с именем DllExternalProc в модуле uPSC_dll.pas


> не вижу их рекомендаций по загрузке и выгрузке библиотеки


Это интерпретирующий движок, поэтому по идее он обязансам заботиться о загрузке и выгрузке (если конечно же он не предусматривает событий типа OnLoadLibrary/OnUnloadLibrary)

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


_Mouse_   (2007-02-16 13:19:00) [10]

Видел я этот пример:
function ScriptOnUses(Sender: TPSPascalCompiler; const Name: string): Boolean;
{ the OnUses callback function is called for each "uses" in the script.
 It's always called with the parameter 'SYSTEM' at the top of the script.
 For example: uses ii1, ii2;  
 This will call this function 3 times. First with 'SYSTEM' then 'II1' and then 'II2'.
}
begin
 if Name = 'SYSTEM' then begin
   Sender.OnExternalProc := @DllExternalProc;
   { Assign the dll library to the script engine. This function can be found in the uPSC_dll.pas file.
     When you have assigned this, it's possible to do this in the script:
   
       Function FindWindow(c1, c2: PChar): Cardinal; external 'FindWindow@user32.dll stdcall';
       
       The syntax for the external string is 'functionname@dllname callingconvention'.
   }

   Result := True;
 end else
   Result := False;
end;


Но не понятно что они хотят чтобы я указал в этой строке:
Sender.OnExternalProc := @DllExternalProc;
Также не вижу их рекомендаций по загрузке и выгрузке библиотеки. Может их движок сам автоматом делает - не знаю.
Спрашивал у разработчиков вчера - еще не ответили :-(


Сергей М.   (2007-02-16 12:49:00) [11]

Впрочем , судя по описанию на сайте разработчика Pascal Scripts, повода для волнения нет:

TPSDllPlugin    
Allow scripts to use dll functions, the syntax is like:
function FindWindow(C1, C2: PChar): Longint; external 'FindWindowA@user32.dll stdcall';

Т.е. при разработке подключаемой библ-ки в среде С/С++ тебе достаточно придерживаться стандартного stdcall-соглашения.


Сергей М.   (2007-02-16 12:34:00) [12]

Боюсь что затея с написанием подключаемой библ-ки на С/С++ будет неосуществима - стандартное дельфийское умалчиваемое соглашение о вызовах не подходит ни под fastcall, ни под stdcall, ни под pascal (в Cишной трактовке)


Сергей М.   (2007-02-16 12:20:00) [13]

Ну так и будет, наверно, - pascal ...
Смотря что за С ...


_Mouse_   (2007-02-16 12:18:00) [14]


> Не берусь утверждать (надо смотреть исходники), но раз именно
> Pascal Scripts, то довольно очевидно, что ф-ция, адрес которой
> передается первым параметром, должна иметь соглашение о
> вызове, специфичное именно для Паскаля.

А как этот формат правильно будет звучать на Си?


Сергей М.   (2007-02-16 12:08:00) [15]


> Какой тип соглашения будет использоваться?


Не берусь утверждать (надо смотреть исходники), но раз именно PascalScripts, то довольно очевидно, что ф-ция, адрес которой передается первым параметром, должна иметь соглашение о вызове, специфичное именно для Паскаля.

В противном случае (см. мануал по Pascal Scripts) интерпретатор должен распознавать спецификаторы соглашений, отличных от паскалевых - stdcall, cdecl и иже с ними. В этом случае задача сильно упрощается - подключаемая библиотека может иметь "родные" для среды ее разработки соглашения.


Наверх

Титульная страница Поиск, карта сайта Написать письмо