Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

VCL & C


VaY ©   (2007-05-03 03:36:00) 

Здравствуйте, гуру 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.


VaY   (2007-05-03 23:23:00) [1]

спасибо :)


ANB   (2007-05-03 13:18:00) [2]


> Ну, допустим, ты так или иначе получишь адрес published-
> метода по его имени.

А published методов практически и нету. Обычно обработчики событий так объявляются. А на обычные методы RTTI не генериться.


DrPass   (2007-05-03 12:46:00) [3]


>  как получить адрес метода класса по
> его имени

Ну, допустим, ты так или иначе получишь адрес published-метода по его имени. Ну а как ты собираешься поступать с теми методами, для которых не генерируется RTTI, и соответственно, нет никаких зацепок?


> или как другим способом наладить в другом языке работу с
> VCL. OLE, COM,
> COM+, Corba - что угодно, лишь бы это работало

Ну вот так и налаживай - сделай СОМ-обертку к своему компоненту. Можно даже ActiveX-контрол из него сгенерировать


Наверх

Титульная страница Поиск, карта сайта Написать письмо