Форум: "Основная";
Текущий архив: 2007.07.01;
Скачать: [xml.tar.bz2];
ВнизVCL & C Найти похожие ветки
← →
VaY (2007-05-03 03:36) [0]Здравствуйте, гуру Object Pascal и приближенные к ним товарищи =).
Сразу опишу проблему. Мне нужно "научить" _обычный_ C (читай - любой другой язык,
знающий, что такое указатель и умеющий грузить DLL) работать с VCL классами. Не
спрашивайте, где я беру траву и клей =(, но очень нужно, а я не знаю даже, с
какой стороны к этому делу подобраться. Задумка - использовать конструкции
наподобие таких:
// myVclObject: Pointer;
LPVOID myVclObject;
// varToWrite: PChar;
LPSTR varToWrite;
// varToGet: PLongint;
LPLONG varToGet;
//--------------------------
// myVclObject := TIdFTP.Create(param1, param2, param3, ...);
myVclObject = vcl_Invoke(vcl_FetchClass("TIdFTP"), "Create", кол-во_параметров, param1, param2, param3, ...);
// myVclObject.Host := "127.0.0.1";
vcl_SetProp(myVclObject, "Host", LPSTR("127.0.0.1"));
// isActive = myVclObject.Active;
isActive = vcl_GetProp(myVclObject, "Active");
// myVclObject.Connect(123, 456);
vcl_Invoke(myVclObject, "Connect", 2, 123, 456);
// myVclObject.Free();
vcl_Invoke(myVclObject, "Free", 0);
// -------------------------
С получением класса по имени я вроде-бы разобрался. Я делаю RegisterClass([TIdFTP])
в секции инициализации DLL. Это, конечно, накладывает ограничения на функционал,
т.к. приходится ручками указывать ClassReference... но что поделать. =( Дальше,
при обращении к vcl_FetchClass("TIdFTP"), я выполняю GetClass("TIdFTP") - это
работает, я получаю на выходе указатель на класс, если он был унаследован от
TPersistent - а мне большего и не надо.
С чтением/записью публичных свойств любого типа я тоже разобрался. С "той" стороны
обьектные типы представляются как поинтеры, а другие типы, которые одним словом
"automatable", имеют аналоги в обоих языках. Тут уж на крайний случай можно
поставить процедуры перевода значений Си в Делфи и обратно в самих vcl_SetProp и
vcl_GetProp.
Разное количество параметров тоже не проблема - всё сделано через асм.
Самая большая проблема - это vcl_Invoke. Я не знаю, как получить адрес метода класса
по имени. VMTOFFSET и DMTINDEX - это не то... они во-первых, только для виртуальных
и динамических методов... Выцепить таким образом "статический" метод (я не знаю,
как его обозвать - уже голова не соображает) не получается. Под статическим я имею
в виду:
type
TmyClass = class(TObject)
procedure TrickVirtMethod; // этот метод можно достать по индексу и посчитать смещение в VMT, просто VMTOFFSET его не хавает.
public
procedure FaultMethod; // этот метод достать никак не получилось.
end;
Пробовал уже заходить в асме в FaultMethod и сравнивать EAX (указатель на класс)
с EIP. Судя по тому, что я там увидел, он очень далеко от самого класса. Указатель
тупой методой @FaultMethod или Addr(FaultMethod) получить не получается.
Класс-методы тоже являются открытым вопросом. Единственное, что мне удалось получить -
это процедуры по типу MethodAddress("Form1Create"), где Form1Create - хэндлер
OnCreate для TForm. Такой путь рабочий, хоть он и очень ограничен и мне не подходит...
Ведь в доке к MethodAddress и сказано, что он только для "внутреннего использования и
здоровые люди им пользоваться не должны".
Компонент, классом которого нужно управлять из Си, не моего написания и переделывать
или переписывать его заново - непозволительно долгое занятие, к тому же не
являющееся окончательным решением... Ключи компиляции я менять могу, но не более.
В общем, жду любых предложений на тему или как получить адрес метода класса по
его имени, или как другим способом наладить в другом языке работу с VCL. OLE, COM,
COM+, Corba - что угодно, лишь бы это работало и по этому было хоть чуть-чуть
работающих примеров или документации (вариант "Использовать C Builder", увы, не
подходит).
Жду новостей. С уважением, rw0x.
← →
DrPass © (2007-05-03 12:46) [1]
> как получить адрес метода класса по
> его имени
Ну, допустим, ты так или иначе получишь адрес published-метода по его имени. Ну а как ты собираешься поступать с теми методами, для которых не генерируется RTTI, и соответственно, нет никаких зацепок?
> или как другим способом наладить в другом языке работу с
> VCL. OLE, COM,
> COM+, Corba - что угодно, лишь бы это работало
Ну вот так и налаживай - сделай СОМ-обертку к своему компоненту. Можно даже ActiveX-контрол из него сгенерировать
← →
ANB © (2007-05-03 13:18) [2]
> Ну, допустим, ты так или иначе получишь адрес published-
> метода по его имени.
А published методов практически и нету. Обычно обработчики событий так объявляются. А на обычные методы RTTI не генериться.
← →
VaY (2007-05-03 23:23) [3]спасибо :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.07.01;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.004 c