Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 517

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!

Пытаюсь открыть MDI форму из dll, суть такой: прога имеет главное MDI окно и в нем все работает, грузит она dll и вызывает метод, который должен создать MDIChild и передать в Result его HWND, а нет (((( не получается, говорит Access Violation при доступе к памяти.
код Dll в приложении, а прога сама вызывает метод из dll простым обычным способом GetProcAddress и тп....
само исключение возникает, когда в длл срабатывает строчка MDIForm := TForm.Create( Application );

четакое??? как быть????, может кто мне dproj в архиве вышлет (кстати юзаю CodeGear 2007)
спасибо

Приложение:
  1. library Suit;
  2.  
  3. uses
  4. Forms;
  5.  
  6. {$R *.res}
  7. {$E xpl}
  8.  
  9. var DllApp: TApplication;
  10. DllScreen: TScreen;
  11. HApp: TApplication;
  12. MDIForm: TForm;
  13.  
  14. procedure Init( HostApplication, HostScreen: Cardinal ); stdcall;
  15. begin
  16.  
  17. DllApp := Application;
  18. DllScreen := Screen;
  19. HApp := TApplication(HostApplication);
  20. Application := TApplication(HostApplication);
  21. Screen := TScreen(HostScreen);
  22.  
  23. end;
  24.  
  25. procedure Free; stdcall;
  26. begin
  27.  
  28. if MDIForm <> nil then
  29. MDIForm.Free;
  30. Application := DllApp;
  31. Screen := DllScreen;
  32.  
  33. end;
  34.  
  35. function CreateForm(): Cardinal; stdcall;
  36. begin
  37.  
  38. MDIForm := TForm.Create( Application );
  39. MDIForm.ParentWindow := Cardinal( Application.MainForm );
  40. MDIForm.FormStyle := fsMDIChild;
  41. MDIForm.Show;
  42.  
  43. Result := Cardinal( MDIForm );
  44.  
  45. end;
  46.  
  47. exports
  48. Init, Free,
  49. CreateForm;
  50.  
  51. begin
  52. 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

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]:

устал я от коротких резюме

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:37
Выполнено за 0.02 сек.