Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.005 c
2-1181062755
Ctrl
2007-06-05 20:59
2007.07.01
Как загрузит иконку из ресурса в imageList?


3-1175712325
Seme
2007-04-04 22:45
2007.07.01
Не могу подключиться к MySQL.


2-1181493780
GoRdon
2007-06-10 20:43
2007.07.01
Dll


2-1181184636
D@Nger
2007-06-07 06:50
2007.07.01
Обмен данными между родительским MDI и дочерними


2-1181130039
dr_craigan
2007-06-06 15:40
2007.07.01
работа с файлами





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский