![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
О DLL
gemini © (2005-08-08 13:50:00)Здравствуйте.
У меня вопрос в следующем:
Существуют 2 DLL разработанные мной. В каждой из них есть модуль в котором описан класс.
type
TDLLMenuItem =class(TMenuItem)
constructor Create(Owner:TComponent; Caption:String; FormClassName:TClass; FormStyle:TFormStyle);
procedure OnClickNew(Sender: TObject);
private
FormClassName:TClass;
FormDLL:TForm;
FormStyle:TFormStyle;
public
end;
implementation
constructor TDLLMenuItem.Create(Owner:TComponent; Caption:String; FormClassName:TClass; FormStyle:TFormStyle);
begin
inherited Create(Application);
self.Name := 'ItemDatabaseDirectorys_' + FormClassName.ClassName;
self.Caption := Caption;
self.OnClick := self.OnClickNew;
self.FormClassName:=FormClassName;
self.FormStyle := FormStyle;
end;
procedure TDLLMenuItem.OnClickNew(Sender:Tobject);
begin
FormDLL := TForm(TComponentClass(FormClassName).Create(Application));
FormDLL.FormStyle :=FormStyle;
case integer(FormDLL.FormStyle) of
1: begin
FormDLL.WindowState := wsMaximized;
FormDLL.Show;
end;
end;
При инициализации библиотеки ( каждой) создается экземпляр класса
DLLMenuItem:=TDLLMenuItem.Create(Application, <Caption Item>, <Класс формы прикрепленной к создаваемому Item>, fsMDIChild);
<Класс формы прикрепленной к создаваемому Item> класс формы разный в каждой библиотека.
Application ,берется из главного приложения.
Все создается замечательно. Таким образом я реализовал интерфейс управления формами находящимися в DLL-ках.
Проблема возникает когда кликаешь на элементе меню. На каком бы из них не кликнул, вызывается форма из первой подгруженной DLL. В отладчике видно что при клике мы всегда попадаем в один и тот же обработчик OnClickNew в одной и той же DLL.
Хотя обьекты то разные????? Или я что-то не улавливаю? Буду признателен за идеи. Bpl не предлагать ж).
Mx (2005-08-08 18:14:00) [1]Я что-то не пойму, если DLL имеют один и тот же модуль, то как можно определяется, что вызывается обработчик именно из первой DLL?
gemini (2005-08-08 16:41:00) [2]Могу выложить пример. При входе в DLL это значит когда я отладчиком ставлю brp в 1 и во 2 dll заход всегда по первой.
Вот и узнать бы где они прыгают. ж(
Digitman (2005-08-08 16:23:00) [3]
> при входе в dll
что такое "вход в dll" ?
Slym (2005-08-08 16:22:00) [4]Ага и адреса процедур что-то прыгают...
Ошибка не в приведеном коде! а в не приведеном
gemini (2005-08-08 16:17:00) [5]2 Digitman ©
Приотладке находясь в exe элементы имеют разные имена и адресa для click. На деле же при входе в dll заход осуществляетс явсегда в процедуру обработки в первой dll. Процедура выполняется отлично. Форма открывается. Что интересно то в Click() переменная self имеет уже параметры именно менюайтема из первой dll, хотя кликали по второй. Вот такие пироги ж(
evvcom (2005-08-08 16:05:00) [6]
> Нет такого понятия ,обреченность. Есть понятие реализуемо
> и не реализуемо.
Ну, ну... Реализуемо теоретически почти все :), на практике все гораздо сложнее. Почему я использовал слово "обречена"? Потому что многие могут начать стучать себя кулаками в грудь и доказывать, что они подменили Application, Screen и прочие объекты во всех используемых dll, и что все у них прекрасно работает. Да, в некоторых ситуациях это действительно работает. А в некоторых (с которыми они просто не столкнулись) это работать не будет. Отсюда и обречение.
Digitman (2005-08-08 15:55:00) [7]
> gemini © (08.08.05 15:27) [4]
отладчик что говорит ?
gemini (2005-08-08 15:27:00) [8]С раннтаймом нельзя ибо прийдется таскать за собой кучу всякого дополнительного хлама Лучше , для меня, его скомпилить.
/Сильно сказано.
Подобная идея обречена на глюки./
Нет такого понятия ,обреченность. Есть понятие реализуемо и не реализуемо.
Slym (2005-08-08 14:57:00) [9]Значит ошибка не в этом коде, а там где ты подгружаешь dll, создаешь менюшки
just_me (2005-08-08 14:21:00) [10]Bpl не предлагаю, но вот собрать все с runtime packages настоятельно советую
evvcom (2005-08-08 13:56:00) [11]
> Таким образом я реализовал интерфейс управления формами
> находящимися в DLL-ках.
Сильно сказано.
Подобная идея обречена на глюки. Лень разбираться, почему вызывается именно "первая форма", но даже если и разобраться, то рано или поздно выплывут другие глюки.