|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
11.08.2010, 14:14 | #11 | |
Форумчанин
Регистрация: 01.09.2009
Сообщений: 151
|
Цитата:
|
|
11.08.2010, 14:45 | #12 |
Форумчанин
Регистрация: 29.12.2007
Сообщений: 137
|
Я не GunSmoker, но адресное пространство имеет процесс, библиотека собственный процесс не создает, это просто код, который может быть загружен в адресное пространство процесса, которому он понадобится
|
12.08.2010, 03:13 | #14 |
₪₪₪₪₪₪₪₪
Форумчанин
Регистрация: 16.04.2007
Сообщений: 471
|
Дополняя GunSmoker - нужно читать вообще.
|
12.08.2010, 12:13 | #15 | |
Форумчанин
Регистрация: 01.09.2009
Сообщений: 151
|
Цитата:
- почему, когда я загружаю dll (в которой есть вызов RegisterClass(TMyClass)) методом LoadLibrary, то вызов в главной форме GetClass(TMyClass) возвращает nil, а когда грузится пакет методом LoadPackage, то тот же самый вызов возвращает ссылку на зарегистрированный класс? Другими словами, почему в первом случае таблица RTTI, Application и Screen различаются, а во втором случае они общие для dll и приложения? Я даже больше скажу: LoadPackage грузит пакет методом LoadLibrary (естественно с проверками), после чего ищет функцию Initialize в этом пакете и вызывает её. Поэтому вопрос может звучать так: "Что делает ф-ция Initialize, которая автоматически вставляется в любой bpl-пакет?". P.S. Рихтера скачал - читаю. Полезная книжка. Последний раз редактировалось Greek9000; 12.08.2010 в 12:19. |
|
12.08.2010, 12:45 | #16 | |
Форумчанин
Регистрация: 29.12.2007
Сообщений: 137
|
Цитата:
Отвечая на твой ДРУГОЙ вопрос - дело в том, что при компиляции обычной DLL, все юниты, которые она использует, включаются в ее состав, таким образом, у exe и каждой из dll-ок внутри своя версия юнита System, Classes и т.д. Т.е. каждый исполняемый модуль (exe, dll) имеет не только собственную версию кода юнитов, но и собственные RTTI, списки классов, менеджер памяти и прочие структуры данных. Когда мы компилируем с пакетами, юниты, их код и структуры данных, присутствуют только в одном экземпляре внутри своего пакета. Поэтому инфа общая и доступ к ней централизованный. Переводя это на пример с RegisterClasses/GetClass... Случай с обычной DLL 1. RegisterClasses в DLL вызывает код из юнита Clases, включенного в состав этой DLL и заносит данные в собственный список классов 2. GetClass в EXE вызывает код из юнита Classes, включенного в состав этого EXE. Так как список классов EXE-шника ничего не знает о списке классов DLL, то для EXE этот класс не зарегистрирован Случай с пакетами 1. Вызов RegisterClasses произвольного пакета обращается к функции из пакета rtl.bpl и заносит класс в список этого пакета 2. Вызов GetClass из произвольного пакета или приложения, использующего пакеты, обращается к функции из того же пакета rtl.bpl, которая, как видно выше, знает о том, что класс был зарегистрирован Вот и вся магия. Это же, кстати, еще и причина того, что 1. Операторы is/as не будут работать в exe, если объект создан в dll и наоборот (если использовать пакеты - будут работать). Видел когда-нибудь ошибку с текстом "Can not assign TFont to TFont"? Вот это она и есть. DLL.TFont <> EXE.TFont 2. Нельзя гонять между dll и exe объекты и классы, т.к. кроме п.1. можно нарваться на множество проблем, связанных с несоответствием данных класса или объекта в приложении и библиотеке (опять таки, в случае использования пакетов - можно) 3. Нельзя так просто выделить память в exe а освободить в dll и наоборот - нужно расшаривать менеджер памяти (ShareMem, SimpleShareMem), так как менеджер не может освободить память, которую он не выделял, в его записях нет необходимых для этого данных. При использовании пакетов такой проблемы нет, менеджер памяти и так единый Последний раз редактировалось Ins; 12.08.2010 в 13:34. |
|
12.08.2010, 14:16 | #17 | |
Форумчанин
Регистрация: 01.09.2009
Сообщений: 151
|
Цитата:
Итак, возвращаясб к напечатанному... Получается, что есть принципиальная возможность зарегистрировать класс формы в dll-ке и передать его в приложение? (Тут речь не идёт о том, как это сделать - только о возможности этого) После редактирования предыдущего поста вопрос снят, как и следующий, вытекающий из первого Думается мне, что не все телепатические способности были утрачены при рождении Если этот так, то сразу возникает след. вопрос. Предположим, что подобный вызов dll_frmClass = MyGetDLLClass('TfrmDLL'); вернёт мне ссылку на класс формы хранящейся в DLL (скомпилированный. без пакетов). Тогда смогу ли я работать с dll_frmClass так же, как если бы я получил на него ссылку при помощи стандартной GetClass? Тоесть, можно ли будет выполнить примерно такой код Код:
Последний раз редактировалось Greek9000; 12.08.2010 в 14:33. |
|
12.08.2010, 14:20 | #18 | ||
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
Цитата:
Цитата:
Поскольку этим вы привязываетесь к Delphi, то зачем вам DLL? Почему бы просто не использовать пакеты - ведь это удобно.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
Последний раз редактировалось Stilet; 12.08.2010 в 14:25. |
||
12.08.2010, 14:24 | #19 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
Проверь ее на nil и на TfrmDLL и если все верно работай.
I'm learning to live...
|
|
12.08.2010, 14:26 | #20 | |||
Форумчанин
Регистрация: 29.12.2007
Сообщений: 137
|
Цитата:
Цитата:
Цитата:
Последний раз редактировалось Ins; 12.08.2010 в 14:36. |
|||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Runtime runtime = Runtime.getRuntime(); | Pti44ka | Общие вопросы по Java, Java SE, Kotlin | 1 | 22.11.2009 10:45 |
без запроса Package? | koleko | Общие вопросы Delphi | 2 | 18.02.2009 22:59 |
RunTime Error713 (VB) | vio | Помощь студентам | 2 | 12.12.2008 20:45 |
Unit 'MyLib' implicitly imported into package 'MyPackage'. как исправить? | SkAndrew | Компоненты Delphi | 0 | 06.04.2008 00:28 |
Runtime programming | JoanM | Общие вопросы Delphi | 4 | 09.01.2008 11:00 |