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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 5 857

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

Здравствуйте!
1. В DoTerminate выполняется только одно событие
2. Прогресс бар при последующих закачках не двигается и вообще неправильно показывает прогресс
3. Нулевая реакция на синхронизацию (написанные там события не выполняются)

Тоже самое без DLL работает Великолепно. В чём проблема или это неизбежный косяк DLL?

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Приложение:
  1. library dll;
  2.  
  3. uses
  4. SysUtils,
  5. Windows,
  6. Dialogs,
  7. Controls,
  8. Unit1 in 'Unit1.pas' {Form1};
  9.  
  10. {$R *.res}
  11.  
  12. procedure ShowInfo(Win: Integer); stdcall;
  13. begin
  14. Form1[Win] := TForm1.Create(nil);
  15. Form1[Win].Show;
  16. end;
  17.  
  18. function FormClosed(Win: Integer): Integer;
  19. begin
  20. if not Form1[Win].Visible then
  21. begin
  22. Form1[Win].Release;
  23. Result := 1;
  24. end
  25. else Result := 0;
  26. end;
  27.  
  28. exports
  29. ShowInfo, FormClosed;
  30.  
  31. begin
  32. end.


Shouldercannon Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Shouldercannon (статус: Посетитель)
Вопрос отправлен: 2 января 2012, 12:19
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 7; последнее сообщение — 3 января 2012, 20:03; участников в обсуждении: 2.

2 января 2012, 16:07: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Работа с компонентами и библиотеками модератором Ерёмин А.А.

Вадим К

Вадим К (статус: Академик), 2 января 2012, 21:48 [#1]:

Использование форм в dll чревато самыми интересными последствиями, которые сложно вычислить и объяснить. Костылей можно натворить, но потом в другом месте вылезет. Оно вам нужно?
Галочка "подтверждения прочтения" - вселенское зло.
Shouldercannon

Shouldercannon (статус: Посетитель), 2 января 2012, 23:29 [#2]:

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

[quote]Косяк не DLL, а косяк в незнании работы GUI Windows-приложений и структуры Delphi-приложений. Проблема в том, что у тебя, при загрузке формы из dll отсутствует очередь сообщений, которая в Delphi-приложениях реализуется в объекте Application. Надо объекту Application из dll передать хендл объекта Application приложения, из которого ты загружаешь dll.[/quote]
Что можете сказать по поводу этого ответа?
Вадим К

Вадим К (статус: Академик), 3 января 2012, 13:44 [#3]:

Для того, что бы длл не висла, прогрессбар не нужен. Используйте себе TThread и не тревожтесь. Вот только onTerminate лучше не использовать - допишите в конец onExecute нужный код. Дело в том, что onTerminate может вызываться как в контексте текущего потока, так и главного. А когда это в длл...

По поводу цитаты. Человек предлагает вставить костыль. Ну, оно может заработает, но завтра вылезет другой.
Галочка "подтверждения прочтения" - вселенское зло.
Shouldercannon

Shouldercannon (статус: Посетитель), 3 января 2012, 17:24 [#4]:

Дискуссия становится всё горячее и запутанней.
[quote]1. Автор не прав. Если все сделать корректно, используя знания работы Delphi-программ и WinApi, то форма из dll нормально работает. Ну а если применять при разработке быдлокод без понятия, а вставлением костылей методом научного, а точнее лженаучного тыка, то да - можно поиметь интересные, а порой плачевные последствия.
2. Вычислить и объяснить можно все. Для этого существует справочная литература, исходные коды, и множественный инструментарий программиста: отладчики и дизассемблеры.[/quote]
Вадим К

Вадим К (статус: Академик), 3 января 2012, 17:50 [#5]:

кто этот "Автор", и кто вообще все это пишет? Или в данном случае "Автор" - это я? Раз Ваш эксперт знает, так пусть и напишет Вам его правильное решение. Но я настойчиво не рекомендую использовать формы в dll.
Да я и горячести дискуссии не вижу. Я с ним не спорил, это Вы тут пытаетесь создать дискуссию.
Галочка "подтверждения прочтения" - вселенское зло.
Shouldercannon

Shouldercannon (статус: Посетитель), 3 января 2012, 19:03 [#6]:

Под "Автор" подразумеваетесь Вы. Если он такой супер программист, то я попробую с ним написать то, с чем столкнулся при использовании потока в DLL и доказать, что сие можно сделать без костылей :)
Вадим К

Вадим К (статус: Академик), 3 января 2012, 20:03 [#7]:

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

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

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