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

Вниз

Подключение библиотеки к Pascal Scripts   Найти похожие ветки 

 
_Mouse_   (2007-02-16 11:59) [0]

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


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


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


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

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


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


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

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


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

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


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

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


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

Впрочем , судя по описанию на сайте разработчика 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-соглашения.


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

Видел я этот пример:
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 13:37) [7]


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


Ну как что ?

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


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


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

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


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

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


 
Loginov Dmitry ©   (2007-02-16 17:24) [9]

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


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


 
DevilDevil ©   (2007-02-16 17:39) [10]

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

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

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


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

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


 
DevilDevil ©   (2007-02-17 20:16) [12]

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

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

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


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


> 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 not completely standard across all compilers, so it should be used with caution. In FASTCALL, the first 2 or 3 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, often in Right-to-Left order (similar to CDECL)

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


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


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

p.s.


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


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


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

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


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


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


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



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

Текущий архив: 2007.04.15;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.046 c
1-1171990047
webpauk
2007-02-20 19:47
2007.04.15
Правильность уничтожения


2-1174959952
>>DEATH<<
2007-03-27 05:45
2007.04.15
помогите исправить ошибку


2-1174909065
bagos
2007-03-26 15:37
2007.04.15
stringgrid


2-1175002596
Tor
2007-03-27 17:36
2007.04.15
Grid или DBGrid


2-1174605776
dreamse
2007-03-23 02:22
2007.04.15
Преобразовать руские буквы для поиска в google