|
Вопрос # 5 517/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Пытаюсь открыть MDI форму из dll, суть такой: прога имеет главное MDI окно и в нем все работает, грузит она dll и вызывает метод, который должен создать MDIChild и передать в Result его HWND, а нет (((( не получается, говорит Access Violation при доступе к памяти.
код Dll в приложении, а прога сама вызывает метод из dll простым обычным способом GetProcAddress и тп....
само исключение возникает, когда в длл срабатывает строчка MDIForm := TForm.Create( Application );
четакое??? как быть????, может кто мне dproj в архиве вышлет (кстати юзаю CodeGear 2007)
спасибо
Приложение: Переключить в обычный режим- library Suit;
-
- uses
- Forms;
-
- {$R *.res}
- {$E xpl}
-
- var DllApp: TApplication;
- DllScreen: TScreen;
- HApp: TApplication;
- MDIForm: TForm;
-
- procedure Init( HostApplication, HostScreen: Cardinal ); stdcall;
- begin
-
- DllApp := Application;
- DllScreen := Screen;
- HApp := TApplication(HostApplication);
- Application := TApplication(HostApplication);
- Screen := TScreen(HostScreen);
-
- end;
-
- procedure Free; stdcall;
- begin
-
- if MDIForm <> nil then
- MDIForm.Free;
- Application := DllApp;
- Screen := DllScreen;
-
- end;
-
- function CreateForm(): Cardinal; stdcall;
- begin
-
- MDIForm := TForm.Create( Application );
- MDIForm.ParentWindow := Cardinal( Application.MainForm );
- MDIForm.FormStyle := fsMDIChild;
- MDIForm.Show;
-
- Result := Cardinal( MDIForm );
-
- end;
-
- exports
- Init, Free,
- CreateForm;
-
- begin
- end.
 |
Вопрос задал: Меньшенин (статус: Посетитель)
Вопрос отправлен: 21 июля 2011, 21:20
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 7; последнее сообщение — 29 июля 2011, 17:26; участников в обсуждении: 4.
22 июля 2011, 11:30: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Работа с компонентами и библиотеками модератором Ерёмин А.А.
|
Вадим К (статус: Академик), 22 июля 2011, 12:24 [#1]:
ответ прост и известный - не использовать формы в dll. Если сильно-сильно хочется - то использовать bpl, все остальное костыли и глюки.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Меньшенин (статус: Посетитель), 22 июля 2011, 14:43 [#2]:
спасибо за ответ,
только это не ответ, а отмазка...
а по существу мнения будут????
(для типов, мыслящих аналогичным образом, скажу, что сей момент для моего проекта очень важен, поскольку мое приложение должно быть максимально гибким)
|
|
Толяныч (статус: 4-ый класс), 22 июля 2011, 21:47 [#3]:
Меньшенин:
Может, не мое дело, но ответ грубый и самомнением разит за версту. Раз такая ума палата, то зачем вопросы в форум задавать ?
|
|
DNK (статус: Студент), 22 июля 2011, 22:50 [#4]:
Подобные вопросы всплывают с завидной регулярностью. Вот некоторые из них: 1195, 2091, 2686, 3025, 3230, 4395, 5251, 5276. Почитай или попробуй связаться с этими братьями по разуму, может у кого-то опыт более удачным получился.
По существу, имея ту информацию что дана в вопросе, могу дать ответ: "А чёрт его знает..."
"Digital Networked Knight"
|
|
Меньшенин (статус: Посетитель), 27 июля 2011, 16:42 [#5]:
Дико извиняюсь, уважаемые эксперты!
ответ на мой вопрос тут:
http://delphi.about.com/library/weekly/aa020805a.htm
гласит:
Как сказать, что детская форма MDI определила местонахождение в DLL, какая форма - свой родитель (так, чтобы это фактически появилось как детская форма)? Прикладной объект имел обыкновение создавать детскую форму MDI (в родителе MDI), не тот же самый Прикладной объект, который что Вы имеете в DLL! К тому же, объект Экрана (контроль за курсором) также отличается.
Ребенок MDI в DLL? Ни в коем случае!
Как Вы могли бы предположить из названия, нет НИКАКОГО способа поместить детскую форму MDI в DLL, и звонить оно от некоторого MDI печатает заявление. Даже при том, что Вы могли бы определить местонахождение некоторых статей в Интернете, которые описывают, как "послать" Прикладной объект в DLL (для детского окна, которое будет создано в правильном родителе MDI), этот подход не будет работать (по крайней мере, не будет работать с Дельфи> 5 версий)!
Но, каково решение?
Если Вы хотите сгруппировать детей MDI в DLL, Вы должны построить хозяина заявление MDI и DLL с пакетами во время выполнения. Это гарантирует, что все модули и главное заявление используют те же самые объекты Заявления и Экрана так же как тот же самый случай RTL и VCL. Чтобы быть на 100 % уверенными, Вы должны использовать Пакеты вместо DLLs (почему беспорядок с DLLs, когда те детские формы MDI имеют смысл только в Вашем заявлении Дельфи)!
---------------------------
вот так всегда задаю вопросы, ответы на которые умещаются в три буквы "НЕТ"
|
|
Вадим К (статус: Академик), 27 июля 2011, 17:55 [#6]:
как видите, мой ответ - это просто краткое резюме приведенного перевода
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Меньшенин (статус: Посетитель), 29 июля 2011, 17:26 [#7]:
устал я от коротких резюме
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|