Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.02.25;
Скачать: [xml.tar.bz2];

Вниз

Form Designer without Delphi   Найти похожие ветки 

 
Batiskaf   (2002-02-07 13:52) [0]

Привет всем. Значит хочу сначала заметить, я не большой специалист в Делфи, но что то еще помню, хотя вот уже 3 года как пишу исключительно на С++ ( и очень при этом кайфую:)))
Проблема в следующем, как известно, Делфи сериализует формы в рессурсы в формате RCDATA, что не позволяет открыть эту форму как ресурс и просмотреть ее в Вижуал Моуд( например в VC открыть как рессурсный модуль ). При рассмотрении структуры сериализации, впринципе можно понять чего он там делает, пишет имя типа, обходит поля( которые себя сами скидывают в стрим, а если они простых типов - то их форма сама в состоянии скинуть ), скидывает типы чаилд компонент и , формирует DFM файл т.д. - все что позволяется делать на динамическом связывании. Хотелось бы написать подобный вижуал едитор, только он должен работать с откомпилированными бинарными модулями ( длл и ексе ). Но проблемма как понимаю в следующем - для десериализации и построения формы и списка ее свойств мне прежде всего нужно получить доступ к типам, откомпилированным в этой длл, т.е условно говоря ф-ция GetClass("TFormFromDll") должна мне возвратить класс из этого самого модуля, но ф-ция обходит список ClassList который находится в текущем модуле и понятия не имеет что другой, подключившийся модуль имеет такой же список. Вопрос в следующем, есть ли возможность получить доступ к КлассЛист именно необходимого модуля, может есть какие то лазейки, да и Делфи же в состоянии как то визуализировать DFM модуль, хотя может он компилирует находу... Кароче, если кто копался в этой теме - поделитесь, буду очень благодарен.


 
Batiskaf   (2002-02-07 15:42) [1]

Ну кто нибудь скажет мне чего нибудь вразумительное по-этому поводу???


 
Johnmen   (2002-02-07 15:46) [2]

Это вряд ли - никому не интересно...:(


 
Batiskaf   (2002-02-07 16:09) [3]

Удалено модератором


 
Johnmen   (2002-02-07 16:15) [4]

Кто-нибудь знает ;) , да только ему не интересно тереть на эту тему....лень....


 
vuk   (2002-02-07 16:37) [5]

Никаких внутренних списков классов для модуля в RTTI нет.


 
Batiskaf   (2002-02-07 17:09) [6]

Уважаемый vuk, рекомендую вам прежде чем чего-то говорить, покопаться в исходниках VCL и выяснить чего же делает ф-ция GetClass и какой список она обходит


 
vuk   (2002-02-07 17:29) [7]

to Batiskaf:
Вы думаете я не знаю что делает GetClass? Не волнуйтесь, я это знаю, а вот Вы похоже нет. :o) GetClass обходит список классов, зарегистрированных при помощи RegisterClass. А это используется крайне редко (на всю VCL D5 всего 3 случая использования). Как Вы думаете, вернет Вам GetClass что-нибудь полезное? ;o)


 
EAlexander   (2002-02-07 17:29) [8]

Form Designer в Delphi - это вообще отдельная песня, причем он даже навороченный и много чего может, что обычно не используется.

И что мешает, просто прочитать RCData, после чего перевести все это в TXT и интерпритировать себе на здоровье.

P.S. в для КАЖДОГО компонента (и не визуального тоже) Delphi хранит координаты, где его поместить на Form (или Parent), после чего за отрисовку компонента уже отвечает package, который содержит этот компонент и в design-mode работает только пакет.

P.S. в Design mode через Designer можно обратиться к реальной форме, ту, которую мы видим на экране и обходить ее как обычную форму.


 
Юрий Зотов   (2002-02-07 19:27) [9]

> Как получить КлассЛист другого модуля...

Никак. Список классов для МОДУЛЕЙ не строится, он ОДИН на всю программу. Но для run-time он сам собой не формируется, это надо делать ручками. А Вы, похоже, этого не делаете, поэтому GetClass Вам ничего и не дает - а вовсе не потому, что она ходит по какому-то там несуществующему "списку другого модуля".


> ...кто специалист в структуре RTTI в Делфи???

Например, Vuk. Или я. Или еще очень многие. Но, как Вам уже сказали, список классов к RTTI прямого отношения не имеет.


> ...рекомендую вам прежде чем чего-то говорить, покопаться в исходниках VCL...

Вот в этом я Вами полностью согласен.


 
dimich   (2002-02-08 08:43) [10]

Молодцы !!! Наругались в сласть!!!


 
Johnmen   (2002-02-08 09:47) [11]

А я с самого начала сказал, что с этим челом нечего тереть !


 
Алексей Петров   (2002-02-08 10:09) [12]

Список классов можно и без RegisterClass получить, но хаккерскими методами. Причем код получится разным в зависимости от версии Delphi, которой собран exe-шник.

Все VMT со всем сопутствующим хламом лежат в памяти одна за другой. Находите первый из них и вперед. Если Package-ей нет, то первым будет TObject.

Если packages есть - еще проще. Каждый Package экспортирует имя класса с небольшой декорацией и адресом VMT в виде точки входа.


 
Batiskaf   (2002-02-08 14:59) [13]

To All: Ну и добряки же вы однако :))) Мне всегда казалось что такие фундаментальные вещи разобрать да и другим донести всегда гораздо интереснее нежели копаться с кнопочками и формочками. Ну да ладно, хозяин барин как говорится.

To Алексей Петров.
Большое спасибо Вам за Ваше участие, если можно по-подробнее о экспортируемых Package и именах с декорацией. Три строки кода для наглядности тоже не помешают, заранее благодарен.


 
Алексей Петров   (2002-02-08 16:02) [14]

> Batiskaf (08.02.02 14:59)
На счет 3-х строк кода - о чем речь?
Если хотите подробнее - откройте любой package утилитой, показывающей структуру PE файла - и смотрите. Все там видно.
А описывать это - слишком объемно.


 
Vuk   (2002-02-08 16:05) [15]

to Bstiskaf:
Даже если Вы получите список классов, что Вы будете с ним делать?
Если вы хотите создавать приложения с настраиваемым интерфейсом, то не кажется ли Вам, что вы немного не с той стороны заходите?
Не проще ли будет вынуть ресурс, построить по нему текстовое описание, а потом уже по нему - внешний вид фомы. Все нестандартное можно в конце концов просто рамочками с надписью заменить...

Но лучше будет, если есть такая возможность, встроить поддержку настраиваемого интерфейса в исходное приложение.


 
Юрий Зотов   (2002-02-08 16:26) [16]

> Но лучше будет, если есть такая возможность, встроить
> поддержку настраиваемого интерфейса в исходное приложение.

Если мы хотим создать Delphi-образный редактор, то, похоже, другой возможности просто и нет. Поскольку, например, TObject в двух разных программах - это два разных класса. Значит, даже если удастся получить список классов из EXE или DLL, он окажется практически бесполезным - мы получим имена классов, но не сами классы.

Либо надо идти путем Алексея Петрова - грузить этот EXE/DLL к себе, искать в нем все VMT и строить список классовых ссылок ручками. Но тогда, как сам Алексей и заметил, редактор будет привязан к версии Delphi, в которой компилировался этот EXE/DLL - значит, надо найти еще и способ отвязки. Наверняка возникнут и другие проблемы.

В то время как тот же редактор, но встроенный в саму программу, пишется почти легко и даже почти просто.


 
Batiskaf   (2002-02-08 19:41) [17]

to Юрий Зотов.
{
Если мы хотим создать Delphi-образный редактор, то, похоже, другой возможности просто и нет. Поскольку, например, TObject в двух разных программах - это два разных класса. Значит, даже если удастся получить список классов из EXE или DLL, он окажется практически бесполезным - мы получим имена классов, но не сами классы.
}

Если вы имеете в виду что у процессов разделяемые адресные пространства, то это я вас уверяю не большая проблема - при помощи CreateRemoteThread я могу построить поток в другом процессе из своего процесса, как процедуру окна я даю адресс ф-ции LoadLibrary( ее прототип вполне подходит для процедуры потока: DWORD WINAPI ThreadFunc( LPVOID ) и HINSTANCE LoadLibrary (LPCTSTR lpLibFileName )), а параметром для нее я передаю имя своей длл - и вот я уже в данном процессе, в DllMain отстреливаю новый поток и как рыбка в воде. Единственная проблема(точнее две) - передав в CreateRemoteThread адрес ф-ции LoadLibrary мы передаем адрес ф-ции из нашего процеса в другой, а там такого адреса может и не быть. Единственное радует что это ф-ция системной библиотеки, так что Маунт Поинт системных длл-ей в двух процессах одинков а RVA експортируемой ф-ции соответственно тоже. По-этому стоит передавать в CreateRemoteThread не ф-цию-шлюз а истинную ф-цию LoadLibrary ( по-средством GetProcAddress ). И проблемма с параметром ф-ции нового потока - имя длл-ки нужно алоцировать тоже в адресном пространстве того процесса ( VirtualAllocEx).

С подгрузкой длл-к же таких вышеописанных проблем нет - адрессное пространство длл-и полностью принадлежит мне( точнее процессу моего "абстрактного" Форм Дизайнера).

Вопрос в другом - допустим что у меня в исследуемой Делфи длл определен класс TMyHrenZnamoForm ( имя этого класса я из рессурсов поднять могу - ObjectBinaryToText). И вот из своего процесса я хачу получить класс TClass этого типа. Насколько я почитал, VMT лежит в первом поле со смещением 4 байта от моего инстанса - но инстанса то у меня нет!!! Или может я чаво не понял - другими словами, как из имени класса получить его инстанс, причем класс определен в подключаемом модуле. Ведь для языков с динамическим связыванием это должно делаться как два байта переслать. Прашу прощения за столь прозрачные изречения - напрочь забыл Делфю, помнится все в общих чертах, но вы пишите код, пишите - я пойму :))

to Алексей Петров:
Насколько я помню, Борланд не придерживается Микрософтовского формата PE - они используют Intel OMF? А DumpBin кажется работает только с PE и COFF.


 
Vuk   (2002-02-08 22:00) [18]

>Или может я чаво не понял - другими словами, как из имени
>класса получить его инстанс, причем класс определен в
>подключаемом модуле.
В общем случае - никак. Хотя из пакета если его динамически подгрузить, может и можно что вытянуть. Для этого придется разбираться как компилятор преобразует имена символов и что именно за что отвечает.

>Насколько я помню, Борланд не придерживается Микрософтовского
>формата PE - они используют Intel OMF
Вы формат исполняемых модулей с форматом объектных модулей не путаете? ;o)

Не ломайте Вы себе голову, все равно на форму добавить что-то, что туда не положили во время разработки не получится, можно только имеющееся подвигать, ну может еще свойствами пощелкать. А такие вещи проще из самой программы делать, а не из внешнего редактора.


 
Дремучий   (2002-02-08 22:52) [19]

Vuk ©
{
Не ломайте Вы себе голову, все равно на форму добавить что-то, что туда не положили во время разработки не получится, можно только имеющееся подвигать, ну может еще свойствами пощелкать. А такие вещи проще из самой программы делать, а не из внешнего редактора.
}

а редактор 1с кажется умеет все (с определенным набором класов)...
;)




Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.02.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.005 c
1-79384
С_тоша
2002-02-06 18:05
2002.02.25
Мастера Очень нужно


1-79397
Никита
2002-02-09 14:18
2002.02.25
ошибка


4-79509
DrR
2001-12-26 15:50
2002.02.25
Active Desktop


1-79338
ЕвгенийА
2002-02-08 01:20
2002.02.25
Вопрос по формам...


14-79430
Havez
2002-01-06 00:18
2002.02.25
RXLib





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский