|
delphi-7 exe=>dll=>dll release vs free win-10
|
|||
---|---|---|---|
#18+
Моя древнейшая система мамонта плавно перетекает на вин-10 Ситуация: из экзе вызывается длл, из него вызывается длл (и далее может) всё работает в сотнях случаев сегодня наткнулись на одну вызываемую длл, которая не работает в новых условиях вин-10 Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
после release выдает ошибку Код: plaintext 1. 2. 3.
поменял FilterForm.release на FilterForm.free - у нас так везде, кроме этого приложения - и ошибка ушла на прошлых версиях, 2003 и win-7 - с release работает и сейчас коллеги, подскажите, что это? на нашем форуме искал, но что-то не нашел каких-то потоков, процессмессаджей нету ЗЫ: на всякий - FastMM4 есть в проектах, какой-то такой же древний ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 20:04 |
|
delphi-7 exe=>dll=>dll release vs free win-10
|
|||
---|---|---|---|
#18+
andreymx поменял FilterForm.release на FilterForm.free - у нас так везде, кроме этого приложения - и ошибка ушла Я бы ещё заменил Create(Application) на Create(nil). Незачем плодить потенциальные проблемы, даже если прямо сейчас они не стреляют. andreymx коллеги, подскажите, что это? на нашем форуме искал, но что-то не нашел Это хз. В том смысле, что можно потратить сколько-то сил и докопаться до причины в вашем случае - но нужно ли? Использовать Release в такой ситуации неверно. Вы написали более правильный код - ошибка ушла. Далеко не факт, что есть какая-то другая ошибка, из-за которой всё так происходит. Лично я и в других местах поменял бы такие Release на Free. P.S. Кстати - я бы посмотрел, что за Application у вас в DLL и не происходит ли так, что он грохается при выходе из DLL. Тогда будет милая ситуация типа "Application грохнул форму и тут наконец-то пришла пора сработать Release с понятными последствиями". ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 20:39 |
|
delphi-7 exe=>dll=>dll release vs free win-10
|
|||
---|---|---|---|
#18+
softwarer Я бы ещё заменил Create(Application) на Create(nil). Незачем плодить потенциальные проблемы, даже если прямо сейчас они не стреляют. тогда не нашли, чем Create(Application) хуже или лучше Create(nil). Ни разу не сталкивался с проблемами ни там, ни там (конечно, если правильно чистится). Я бы почитал на эту тему. andreymx Лично я и в других местах поменял бы такие Release на Free. ЗЫ: большое спасибо за помощь ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 20:44 |
|
delphi-7 exe=>dll=>dll release vs free win-10
|
|||
---|---|---|---|
#18+
andreymx тогда не нашли, чем Create(Application) хуже или лучше Create(nil). Ни разу не сталкивался с проблемами ни там, ни там (конечно, если правильно чистится). Разница между ними в том, что Create(Application) вешает на стенку заряженное ружьё, которое никогда не стреляет, а Create(nil) просто не вешает ружья. Я согласен с тем, что возможность проблем чисто теоретическая, но предпочитаю обходиться даже без такой. Для модальных форм, которые уничтожаются в месте вызова - Create(nil). Для немодальных форм, которые существуют неопределённо долго - Create(Application) + caFree. Эти два варианта покрывают практически все потребности, что-то ещё нужно.. исчезающе редко. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 20:55 |
|
delphi-7 exe=>dll=>dll release vs free win-10
|
|||
---|---|---|---|
#18+
softwarer P.S. Кстати - я бы посмотрел, что за Application у вас в DLL и не происходит ли так, что он грохается при выходе из DLL. Тогда будет милая ситуация типа "Application грохнул форму и тут наконец-то пришла пора сработать Release с понятными последствиями". тут всё просто Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
всякие initialization и finalization отсутствуют ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 21:04 |
|
delphi-7 exe=>dll=>dll release vs free win-10
|
|||
---|---|---|---|
#18+
softwarer andreymx тогда не нашли, чем Create(Application) хуже или лучше Create(nil). Ни разу не сталкивался с проблемами ни там, ни там (конечно, если правильно чистится). Разница между ними в том, что Create(Application) вешает на стенку заряженное ружьё, которое никогда не стреляет, а Create(nil) просто не вешает ружья. Я согласен с тем, что возможность проблем чисто теоретическая, но предпочитаю обходиться даже без такой. Для модальных форм, которые уничтожаются в месте вызова - Create(nil). Для немодальных форм, которые существуют неопределённо долго - Create(Application) + caFree. Эти два варианта покрывают практически все потребности, что-то ещё нужно.. исчезающе редко. есть у нас волшебная тулза, встроенный типа отладчик он сканирует у аппликейшна все контролы и компоненты и в волшебном окошке их все можно посмотреть, доступ в волшебное окошко по группе в ад особенно интересны датасеты - запросы, фильтры, имя БД, схема (пароль нет конечно), количество строк и т.д. и даже сами данные а если что-то создано от nil, то фиг его найдешь так просто ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 22:35 |
|
delphi-7 exe=>dll=>dll release vs free win-10
|
|||
---|---|---|---|
#18+
andreymx есть у нас волшебная тулза, встроенный типа отладчик Ага, лет двадцать назад я здесь описывал, как такие делать и чем это хорошо :) andreymx а если что-то создано от nil, то фиг его найдешь так просто Так же легко. Просто нужно использовать для поиска ещё и Screen.Forms. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 23:02 |
|
delphi-7 exe=>dll=>dll release vs free win-10
|
|||
---|---|---|---|
#18+
andreymx softwarer P.S. Кстати - я бы посмотрел, что за Application у вас в DLL и не происходит ли так, что он грохается при выходе из DLL. Тогда будет милая ситуация типа "Application грохнул форму и тут наконец-то пришла пора сработать Release с понятными последствиями". тут всё просто Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
всякие initialization и finalization отсутствуют ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 00:19 |
|
delphi-7 exe=>dll=>dll release vs free win-10
|
|||
---|---|---|---|
#18+
andreymx softwarer P.S. Кстати - я бы посмотрел, что за Application у вас в DLL и не происходит ли так, что он грохается при выходе из DLL. Тогда будет милая ситуация типа "Application грохнул форму и тут наконец-то пришла пора сработать Release с понятными последствиями". тут всё просто Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
всякие initialization и finalization отсутствуют initialization и finalization тут совсем ни при чем. Application это глобальная переменная модуля Forms , которая инициализируется при загрузке исполняемого Дельфийского файла. Будь это приложение или DLL. Таким образом для процедур/функций вашей основной программы её значение одно, а для функций/процедур в DLL её значение совсем другое. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 01:41 |
|
delphi-7 exe=>dll=>dll release vs free win-10
|
|||
---|---|---|---|
#18+
kealon(Ruslan) andreymx пропущено... тут всё просто Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
всякие initialization и finalization отсутствуют ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 05:06 |
|
delphi-7 exe=>dll=>dll release vs free win-10
|
|||
---|---|---|---|
#18+
northener andreymx пропущено... тут всё просто Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
всякие initialization и finalization отсутствуют initialization и finalization тут совсем ни при чем. Application это глобальная переменная модуля Forms , которая инициализируется при загрузке исполняемого Дельфийского файла. Будь это приложение или DLL. Таким образом для процедур/функций вашей основной программы её значение одно, а для функций/процедур в DLL её значение совсем другое. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 05:07 |
|
delphi-7 exe=>dll=>dll release vs free win-10
|
|||
---|---|---|---|
#18+
andreymx kealon(Ruslan) пропущено... а не падало в 7-ке потому что dll-ки не выгружаются там сразу Метод release у формы, это костылёк, что бы можно было убить форму в её же обработчиках Он просто PostMessage отправляет и далее в обработчике на это сообщение форма убивает себя. А если вы реально выгрузили dll-ку, то и кода обработчика уже нет - это и вызывает AV. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 09:36 |
|
delphi-7 exe=>dll=>dll release vs free win-10
|
|||
---|---|---|---|
#18+
andreymx kealon(Ruslan) пропущено... Потому что основной принцип надёжного программирования - не делать лишних действий. Каждое лишнее действие, не привнося в приложение ничего нужного, привносит риск дополнительных проблем. В данном случае первое лишнее действие: Create(Application) вместо Create(nil) - установка ненужной связи освобождения объекта. Второе лишнее действие: Release вместо Free - использование PostMessage вместо строго детерминированного времени уничтожения объекта. Третье лишнее действие: FreeLibrary вместо ничегонеделанья. Каждое по отдельности - не делает ничего страшного, а все вместе - складываются в ошибку. Классика. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 10:41 |
|
delphi-7 exe=>dll=>dll release vs free win-10
|
|||
---|---|---|---|
#18+
softwarer Третье лишнее действие: FreeLibrary вместо ничегонеделанья. основной принцип делфи: создал - убери за собой ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 10:45 |
|
delphi-7 exe=>dll=>dll release vs free win-10
|
|||
---|---|---|---|
#18+
andreymx softwarer Третье лишнее действие: FreeLibrary вместо ничегонеделанья. Потому что лишнее. Никто не сможет сказать, что нужное делается таким образом и что плохого будет, если этого не сделать. FreeLibrary имеет смысл только в отладочных целях, когда хочется не выходя из приложения перекомпилировать dll и продолжить отладку с новой версией. andreymx основной принцип делфи: создал - убери за собой Это лирика. В данном случае у неё нет содержания. Если создавать файл с FILE_FLAG_DELETE_ON_CLOSE - его не нужно явно уничтожать. Вот и здесь так же. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 11:00 |
|
delphi-7 exe=>dll=>dll release vs free win-10
|
|||
---|---|---|---|
#18+
есть функция которая грузит длл, вызывает опубликованную функцию и выгружает длл а та длл может вызываться в общем случае из других длл, вызываемых из этой длл все это решается, но метод "создал-использовал-почистил" в общем случае мне больше нравится ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 11:48 |
|
delphi-7 exe=>dll=>dll release vs free win-10
|
|||
---|---|---|---|
#18+
andreymx метод "создал-использовал-почистил" в общем случае мне больше нравится Есть форма, а есть суть. Гуманитарии уделяют основное внимание форме, но инженеру должно видеть суть. Сутью "почистил" является уборка мусора. Какой мусор убирается во FreeLibrary? Это ложная аналогия, метода создал/использовал/почистил здесь нет. В этом случае собраны четыре в разной степени плохих решения. Если хотя бы одно из них заменить хорошим - проблемы не будет. А если все четыре заменить хорошими - не будет и других потенциальных или реальных проблем. И мне как инженеру нравится именно это. Отдельно забавен вопрос накладных расходов. Постоянная перезагрузка DLL имеет все шансы дополнительно тормозить приложение многократным выполнением ненужных операций. Правда, спасибо дедушке Биллу, винда старается смикшировать эту ошибку разработчиков и подстелить им соломки, но здесь уже как повезёт. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 12:00 |
|
delphi-7 exe=>dll=>dll release vs free win-10
|
|||
---|---|---|---|
#18+
andreymx есть функция которая грузит длл, вызывает опубликованную функцию и выгружает длл а та длл может вызываться в общем случае из других длл, вызываемых из этой длл все это решается, но метод "создал-использовал-почистил" в общем случае мне больше нравится "создал-использовал-почистил" - это про управление ресурсами, потенциально совместного использования, в первую очередь - памятью. И даже в этом случае есть два базовых сценария - "занял-использовал-освободил" и "занял-использовал-оставил себе в резерве для повторного использования". Работа с dll - это, в логическом смысле, ближе к работе с удаленным сервером. "создал-использовал-почистил" тогда сводится к "позвал старт удаленного сервера, обратился с запросом, получил ответ и предложил серверу завершить свою работу, чтобы при следующем вызове предполагать его полный новый старт". Это максимально неэффективный способ взаимодействия. Нельзя, или сложно с разбегу, придумать, как еще больше специально затормозить программу. Наверно так тоже бывает нужно, но в исключительно специфических случаях. Обычно "заранее известно", что сервер точно поднят, и задача сводится к вызову фиксированного интерфейса, с получением ошибки, если на самом деле оно "не поднято". PS если есть freelibrary, значит где-то есть loadlibrary и динамическая привязка точек вызова функций dll Я не знаю ничего про Delphi, но это было бы достаточно неожиданно, если вместо статической привязки в момент старта экзешника, вам на самом деле нужна динамическая работа с библиотекой. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 12:42 |
|
delphi-7 exe=>dll=>dll release vs free win-10
|
|||
---|---|---|---|
#18+
booby Я не знаю ничего про Delphi, но это было бы достаточно неожиданно, если вместо статической привязки в момент старта экзешника, вам на самом деле нужна динамическая работа с библиотекой. Не соглашусь. Начну с того, что статическая привязка на самом деле нужна редко. Её область - взаимодействие с чужими продуктами, поставляемыми в виде DLL. И кроме стандартных виндовых DLL, использовать её особенно негде. Почему? Потому что чужие продукты, как правило, предоставляют COM-интерфейс, и это существенно удобнее. Если речь идёт о своих разработках, то существует много вариантов - как их можно подключить в проект. Наиболее прямой и естественный - просто вкомпилировать. Собрать exe, содержащий в том числе эту разработку. И в большинстве случаев это лучший вариант. Когда же свою разработку целесообразно оформить в виде DLL? Точно не в том случае, когда она потом будет статически линковаться. Свои DLL целесообразно делать тогда, когда они содержат плагины. А плагины заведомо подразумевают динамическую линковку, надеюсь, понятно почему. Наконец, для полноты картины отмечу, что хорошая внутренняя плагин-DLL вообще ничего не экспортирует. Как только в документации написано что-нибудь типа "для подключения как плагин библиотека должна экспортировать функции 1, 2, 3, 4 и 5" - можно смело выписывать архитектору грамоту за профессиональную некомпетентность. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 12:52 |
|
delphi-7 exe=>dll=>dll release vs free win-10
|
|||
---|---|---|---|
#18+
softwarer Наиболее прямой и естественный - просто вкомпилировать. В простых случаях да. Когда-то VBA был "вкомпилирован" в каждое офисное приложение. А потом кто-то подумал - но ведь у нас их не меньше, чем пяток, и все они могут быть подняты одновременно. А вдруг мы чуток памяти сэкономим, если будем не "вкомпилировать", а отображать на память конкретного процесса, статически связываясь на старте. Про плагин - пожалуйста. Он может быть динамически загружаем. Даже и выгружаем, но вряд ли после каждого обращения к его функционалу, а по специальной педали с надписью - "вот такого мне больше не нать"... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 13:00 |
|
delphi-7 exe=>dll=>dll release vs free win-10
|
|||
---|---|---|---|
#18+
booby Когда-то VBA был "вкомпилирован" в каждое офисное приложение. А потом кто-то подумал - но ведь у нас их не меньше, чем пяток, и все они могут быть подняты одновременно. А вдруг мы чуток памяти сэкономим, если будем не "вкомпилировать", а отображать на память конкретного процесса, статически связываясь на старте. И для проекта такого масштаба это, безусловно, здравое и верное соображение. Но когда проектируешь велосипед - глупо ставить на него тормоза от Белаза. Решения нужно подбирать сообразно задаче. booby Про плагин - пожалуйста. Он может быть динамически загружаем. Даже и выгружаем, но вряд ли после каждого обращения к его функционалу Вот с этим я полностью согласен. Постоянные бездумные загрузки-выгрузки - это яркий индикатор карго-культа. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 13:07 |
|
delphi-7 exe=>dll=>dll release vs free win-10
|
|||
---|---|---|---|
#18+
softwarer ... ставить на него тормоза от Белаза... 🤔 Задумался и полез смотреть, какие у Белаза бывают тормоза. Оказалось, это тема - целый макрокосм, в котором каждая модель представляет собой, по сути, отдельную планету. У Сатурнов там и тормозов как таковых нет (кроме стояночных/парковочных) - тормозят приводным электродвигателем, а у Меркуриев есть и тормоза, сообразно нагрузке, приводные иногда весьма габаритными гидродинамическими конструкциями. Интересно, когда оно без тормозов правильно работает. --------------- Содержательно, при связывании на старте - увеличивается время старта. Для консольных утилит это, вероятно, вред. Время обращения к "серверу" при этом очевидно лучше не просто "микросервисов", но и обращения через прокси-структуру после динамической загрузки - на уровень косвенности, как минимум, меньше. Да прямое "вкомпилирование" может выигрывать, но немного, использовать - как тормоза на Белазе - сообразно ситуации. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 14:35 |
|
delphi-7 exe=>dll=>dll release vs free win-10
|
|||
---|---|---|---|
#18+
softwarer Наконец, для полноты картины отмечу, что хорошая внутренняя плагин-DLL вообще ничего не экспортирует. Как только в документации написано что-нибудь типа "для подключения как плагин библиотека должна экспортировать функции 1, 2, 3, 4 и 5" - можно смело выписывать архитектору грамоту за профессиональную некомпетентность. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 22:12 |
|
delphi-7 exe=>dll=>dll release vs free win-10
|
|||
---|---|---|---|
#18+
bk0010 А как с ней работать? А как ты хочешь с ней работать? Чего ты от неё хочешь? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 22:20 |
|
|
Start [/forum/topic.php?fid=58&tid=2036593]: |
0ms |
get settings: |
2ms |
get forum list: |
7ms |
check forum access: |
0ms |
check topic access: |
0ms |
track hit: |
23ms |
get topic data: |
3ms |
get forum data: |
1ms |
get page messages: |
32ms |
get tp. blocked users: |
0ms |
others: | 120ms |
total: | 188ms |
0 / 0 |