Как да прехвърлите метод на клас от Delphi към C библиотека, която приема процедура
Пиша обвивка върху макроезика Squirrel за Pascal.
Има определен клас TSquirrelVM, който бих искал да зададе свои собствени манипулатори за изход и грешки.
Ситуация: Има функция:
И всъщност ги описва в Delphi:
Как мога да пренапиша C++ или Delphi код, така че да мога да предам метод на клас?
ДОБАВЯНЕ:Погледнах същия DXSquirrel, методът на клас C++ се предава там, т.е. Така:
Така че можете да го направите както искам.
За съжаление не можете. Тук авторите направиха един неприятен трик - няма затваряне в обратните извиквания (информация за това кой е предал това обратно извикване). Следователно ще трябва да заобиколите Self, за да възстановите.
Първо, функцията все пак ще трябва да се направи нормална. Е, или статичен клас, ако Delphi е съвсем нов (в противен случай много все още седят на 7). Второ, трябва да имаме TDictionary. Когато създаваме VM, вмъкваме запис там, когато го унищожим, го изтриваме. Така от дескриптора разбираме кой обект го обвива.
В допълнение, много, много си струва на местата, където комуникирате с чужди езици, изрично да посочите конвенцията за повикване - cdecl или stdcall.
UPD. В C++: static също не е метод, а проста функция, само със специални права за достъп до полетата на класа. Ако, разбира се, тя намери някъде предмет от този клас. Точният аналог от Delphi е статичната функция на класа, най-близката е функцията на класа (но към нея също се предава скрития параметър Self, но не екземпляр на обект, а информация за неговия клас).
При изпълнението на същия DXSquirrel е възможно, но от положителната страна. Така че пропускам нещо. Актуализирах въпроса.
Освен това си струва много, много на местата, където контактуватес чужди езици, изрично посочете конвенцията за извикване - cdecl или stdcall.
На етапа на описание е прототипа на функцията за динамично зареждане на DLL. Аз самият дълго време мислех как да посоча stdcall, но нещо не работи както трябва:
Какво грешно описах за stdcall?
Аз самият дълго време мислех как да посоча stdcall, но нещо не работи както трябва:
Нека C постави каквато конвенция искате, Delphi ще ги вземе всички. Всичко това трябва да бъде указано в модула Pascal.
И аз освежих. Тези две функции са точно еквивалентни на този код.
Varargs е възможно само в конвенцията за извикване cdecl.