Текущий архив: 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