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

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

> Який тип угоди використовуватиметься?

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

Ну так і буде, напевно, – pascal. Дивлячись що за С .

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

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

TPSDllPlugin Належні scripts для використання dll функцій, syntax є як: функція FindWindow(C1, C2: PChar): Longint; external "[email protected]stdcall";

Тобто. при розробці підключається біблі-ки в середовищі С/С++ тобі достатньо дотримуватися стандартної stdcall-угоди.

Бачив цей приклад: function ScriptOnUses(Sender: TPSPascalCompiler; const Name: string): Boolean; < функція зворотного виклику OnUses викликається для кожного "використання" в сценарії. Вона завжди викликається з параметром «SYSTEM» у верхній частині сценарію. Наприклад: використовує ii1, ii2; Це викличе цю функцію 3 рази. Спочатку з «SYSTEM», потім « II1", а потім "II2". > begin if Name = "SYSTEM" then begin Sender.OnExternalProc := @DllExternalProc; < Призначте бібліотеку dll до механізм сценаріїв. Цю функцію можна знайти у файлі uPSC_dll.pas. Якщо ви призначили це, це можна зробити в сценарії:

Функція FindWindow(c1, c2: PChar): кардинал; зовнішній "[email protected] stdcall";

Синтаксис зовнішнього рядка: "functionname@dllname callingconvention". >

Результат := Правда; end else Результат := False; end;

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

> не зрозуміло, що вони хочуть, щоб я сказав у цьому рядку

> не вижу їх рекомендацій із завантаження та вивантаження бібліотеки

Це інтерпретуючий рух, тому за ідеєю вінобязансам завантажується про завантаження та вивантаження (якщо звичайно він не передбачає події типу OnLoadLibrary/OnUnloadLibrary)

Хм . цікаво . щас попробую. Спасибо за підсказку :-)

> Це інтерпретуючий рух, тому по ідеї він зобов'язаний сам > заботитись про завантаження та вивантаження

Створені в скрипті об'єкти він не зобов'язаний руйнувати (і не руйнує). Тоже може бути і з вивантаженням бібліотеки.

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

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

Збила! В п'ятому класі!

P.S. ходиш тут, випендрюєшся

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

> 2) за замовчуванням fastcall (тобто register)

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

FASTCALL calling convention isnotcompletely standard across all compilers, so it should be used with caution. У FASTCALL, перші 2або3 32-бітові (або дрібні) arguments є прописані в реєстраторах, з найбільшим звичайним використанням реєстраторів під час edx, eax, and ecx. Additional arguments, або arguments larger then 4-bytes are passed on the stack,oftenin Right-to-Left order (similar to CDECL)

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

> 3) деякі короткі функції вставляються в код інлайн; > однак зроби цю функцію, що експотрується, все "встане > на свої місця"

Це до чого взагалі?

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

Що ж до register-угоди - знову ж таки слід уточнити С-компілятор, тому що хоч угоду і стандартну, не всякий компілятор зобов'язаний її підтримувати.

+ і невсякий компілятор, який підтримує цю угоду, зобов'язаний використовувати її по дифолту, подібно до Delphi