powered by simpleCommunicator - 2.0.19     © 2024 Programmizd 02
Map
Форумы / Delphi [игнор отключен] [закрыт для гостей] / delphi-7 exe=>dll=>dll release vs free win-10
25 сообщений из 31, страница 1 из 2
delphi-7 exe=>dll=>dll release vs free win-10
    #40136784
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Моя древнейшая система мамонта плавно перетекает на вин-10

Ситуация:
из экзе вызывается длл, из него вызывается длл (и далее может)
всё работает в сотнях случаев

сегодня наткнулись на одну вызываемую длл, которая не работает в новых условиях вин-10
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
-- условный пример
-- внутри длл вызывается такая функция
function CallFilter(ID: Integer /удалено лишнее/) : Integer;
var
  FilterForm : TFilterForm;
begin
  /удалено лишнее/
  FilterForm := TFilterForm.Create(Application);
  try
      result := FilterForm.ShowModal;
      if result = mrOK then begin
        /удалено лишнее/
      end;
  finally
    FilterForm.release;
  end;
end;

после release выдает ошибку
Код: plaintext
1.
2.
3.
Project z.exe raised exception class EInvalidPointer
with message 'Invalid pointer operation'.
Process stopped. Use Step or Run to continue.
и далее всё крашится

поменял FilterForm.release на FilterForm.free - у нас так везде, кроме этого приложения - и ошибка ушла
на прошлых версиях, 2003 и win-7 - с release работает и сейчас

коллеги, подскажите, что это? на нашем форуме искал, но что-то не нашел
каких-то потоков, процессмессаджей нету



ЗЫ: на всякий - FastMM4 есть в проектах, какой-то такой же древний
...
Рейтинг: 0 / 0
delphi-7 exe=>dll=>dll release vs free win-10
    #40136790
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx
поменял FilterForm.release на FilterForm.free - у нас так везде, кроме этого приложения - и ошибка ушла

Я бы ещё заменил Create(Application) на Create(nil). Незачем плодить потенциальные проблемы, даже если прямо сейчас они не стреляют.

andreymx
коллеги, подскажите, что это? на нашем форуме искал, но что-то не нашел

Это хз. В том смысле, что можно потратить сколько-то сил и докопаться до причины в вашем случае - но нужно ли? Использовать Release в такой ситуации неверно. Вы написали более правильный код - ошибка ушла. Далеко не факт, что есть какая-то другая ошибка, из-за которой всё так происходит. Лично я и в других местах поменял бы такие Release на Free.

P.S. Кстати - я бы посмотрел, что за Application у вас в DLL и не происходит ли так, что он грохается при выходе из DLL. Тогда будет милая ситуация типа "Application грохнул форму и тут наконец-то пришла пора сработать Release с понятными последствиями".
...
Рейтинг: 0 / 0
delphi-7 exe=>dll=>dll release vs free win-10
    #40136791
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Я бы ещё заменил Create(Application) на Create(nil). Незачем плодить потенциальные проблемы, даже если прямо сейчас они не стреляют.
когда мы активно разрабатывали не только приложухи, но и всю систему, лет эдак 15-19 назад
тогда не нашли, чем Create(Application) хуже или лучше Create(nil). Ни разу не сталкивался с проблемами ни там, ни там (конечно, если правильно чистится). Я бы почитал на эту тему.

andreymx
Лично я и в других местах поменял бы такие Release на Free.
уже поменял



ЗЫ: большое спасибо за помощь
...
Рейтинг: 0 / 0
delphi-7 exe=>dll=>dll release vs free win-10
    #40136793
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx
тогда не нашли, чем Create(Application) хуже или лучше Create(nil). Ни разу не сталкивался с проблемами ни там, ни там (конечно, если правильно чистится).

Разница между ними в том, что Create(Application) вешает на стенку заряженное ружьё, которое никогда не стреляет, а Create(nil) просто не вешает ружья. Я согласен с тем, что возможность проблем чисто теоретическая, но предпочитаю обходиться даже без такой. Для модальных форм, которые уничтожаются в месте вызова - Create(nil). Для немодальных форм, которые существуют неопределённо долго - Create(Application) + caFree. Эти два варианта покрывают практически все потребности, что-то ещё нужно.. исчезающе редко.
...
Рейтинг: 0 / 0
delphi-7 exe=>dll=>dll release vs free win-10
    #40136799
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.
library Filter;

uses
  FastMM4,
  Forms,
  Windows,
  Oracle,
  FilterU in 'FilterU.pas' {FilterForm};

{$R *.res}

exports
        CallFilter,
        ******;

begin
end.




всякие initialization и finalization отсутствуют
...
Рейтинг: 0 / 0
delphi-7 exe=>dll=>dll release vs free win-10
    #40136807
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
andreymx
тогда не нашли, чем Create(Application) хуже или лучше Create(nil). Ни разу не сталкивался с проблемами ни там, ни там (конечно, если правильно чистится).

Разница между ними в том, что Create(Application) вешает на стенку заряженное ружьё, которое никогда не стреляет, а Create(nil) просто не вешает ружья. Я согласен с тем, что возможность проблем чисто теоретическая, но предпочитаю обходиться даже без такой. Для модальных форм, которые уничтожаются в месте вызова - Create(nil). Для немодальных форм, которые существуют неопределённо долго - Create(Application) + caFree. Эти два варианта покрывают практически все потребности, что-то ещё нужно.. исчезающе редко.
вспомнил
есть у нас волшебная тулза, встроенный типа отладчик
он сканирует у аппликейшна все контролы и компоненты и в волшебном окошке их все можно посмотреть, доступ в волшебное окошко по группе в ад
особенно интересны датасеты - запросы, фильтры, имя БД, схема (пароль нет конечно), количество строк и т.д. и даже сами данные
а если что-то создано от nil, то фиг его найдешь так просто
...
Рейтинг: 0 / 0
delphi-7 exe=>dll=>dll release vs free win-10
    #40136811
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx
есть у нас волшебная тулза, встроенный типа отладчик

Ага, лет двадцать назад я здесь описывал, как такие делать и чем это хорошо :)

andreymx
а если что-то создано от nil, то фиг его найдешь так просто

Так же легко. Просто нужно использовать для поиска ещё и Screen.Forms.
...
Рейтинг: 0 / 0
delphi-7 exe=>dll=>dll release vs free win-10
    #40136813
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
library Filter;

uses
  FastMM4,
  Forms,
  Windows,
  Oracle,
  FilterU in 'FilterU.pas' {FilterForm};

{$R *.res}

exports
        CallFilter,
        ******;

begin
end.




всякие initialization и finalization отсутствуют
а после вызова CallFilter наверное и dll-ку ещё прибиваешь?
...
Рейтинг: 0 / 0
delphi-7 exe=>dll=>dll release vs free win-10
    #40136816
northener
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
library Filter;

uses
  FastMM4,
  Forms,
  Windows,
  Oracle,
  FilterU in 'FilterU.pas' {FilterForm};

{$R *.res}

exports
        CallFilter,
        ******;

begin
end.




всякие initialization и finalization отсутствуют


initialization и finalization тут совсем ни при чем.
Application это глобальная переменная модуля Forms , которая инициализируется при загрузке исполняемого Дельфийского файла. Будь это приложение или DLL. Таким образом для процедур/функций вашей основной программы её значение одно, а для функций/процедур в DLL её значение совсем другое.
...
Рейтинг: 0 / 0
delphi-7 exe=>dll=>dll release vs free win-10
    #40136819
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
andreymx
пропущено...



тут всё просто
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
library Filter;

uses
  FastMM4,
  Forms,
  Windows,
  Oracle,
  FilterU in 'FilterU.pas' {FilterForm};

{$R *.res}

exports
        CallFilter,
        ******;

begin
end.





всякие initialization и finalization отсутствуют
а после вызова CallFilter наверное и dll-ку ещё прибиваешь?
а почему нет?
...
Рейтинг: 0 / 0
delphi-7 exe=>dll=>dll release vs free win-10
    #40136820
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
northener
andreymx
пропущено...



тут всё просто
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
library Filter;

uses
  FastMM4,
  Forms,
  Windows,
  Oracle,
  FilterU in 'FilterU.pas' {FilterForm};

{$R *.res}

exports
        CallFilter,
        ******;

begin
end.





всякие initialization и finalization отсутствуют


initialization и finalization тут совсем ни при чем.
Application это глобальная переменная модуля Forms , которая инициализируется при загрузке исполняемого Дельфийского файла. Будь это приложение или DLL. Таким образом для процедур/функций вашей основной программы её значение одно, а для функций/процедур в DLL её значение совсем другое.
да
...
Рейтинг: 0 / 0
delphi-7 exe=>dll=>dll release vs free win-10
    #40136834
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx
kealon(Ruslan)
пропущено...
а после вызова CallFilter наверное и dll-ку ещё прибиваешь?
а почему нет?
логично
а не падало в 7-ке потому что dll-ки не выгружаются там сразу

Метод release у формы, это костылёк, что бы можно было убить форму в её же обработчиках
Он просто PostMessage отправляет и далее в обработчике на это сообщение форма убивает себя. А если вы реально выгрузили dll-ку, то и кода обработчика уже нет - это и вызывает AV.
...
Рейтинг: 0 / 0
delphi-7 exe=>dll=>dll release vs free win-10
    #40136842
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx
kealon(Ruslan)
пропущено...
а после вызова CallFilter наверное и dll-ку ещё прибиваешь?
а почему нет?

Потому что основной принцип надёжного программирования - не делать лишних действий. Каждое лишнее действие, не привнося в приложение ничего нужного, привносит риск дополнительных проблем. В данном случае первое лишнее действие: Create(Application) вместо Create(nil) - установка ненужной связи освобождения объекта. Второе лишнее действие: Release вместо Free - использование PostMessage вместо строго детерминированного времени уничтожения объекта. Третье лишнее действие: FreeLibrary вместо ничегонеделанья. Каждое по отдельности - не делает ничего страшного, а все вместе - складываются в ошибку. Классика.
...
Рейтинг: 0 / 0
delphi-7 exe=>dll=>dll release vs free win-10
    #40136843
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Третье лишнее действие: FreeLibrary вместо ничегонеделанья.
почему же лишнее
основной принцип делфи: создал - убери за собой
...
Рейтинг: 0 / 0
delphi-7 exe=>dll=>dll release vs free win-10
    #40136849
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx
softwarer
Третье лишнее действие: FreeLibrary вместо ничегонеделанья.
почему же лишнее

Потому что лишнее. Никто не сможет сказать, что нужное делается таким образом и что плохого будет, если этого не сделать. FreeLibrary имеет смысл только в отладочных целях, когда хочется не выходя из приложения перекомпилировать dll и продолжить отладку с новой версией.

andreymx
основной принцип делфи: создал - убери за собой

Это лирика. В данном случае у неё нет содержания. Если создавать файл с FILE_FLAG_DELETE_ON_CLOSE - его не нужно явно уничтожать. Вот и здесь так же.
...
Рейтинг: 0 / 0
delphi-7 exe=>dll=>dll release vs free win-10
    #40136862
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть функция
которая грузит длл, вызывает опубликованную функцию и выгружает длл
а та длл может вызываться в общем случае из других длл, вызываемых из этой длл

все это решается, но
метод "создал-использовал-почистил" в общем случае мне больше нравится
...
Рейтинг: 0 / 0
delphi-7 exe=>dll=>dll release vs free win-10
    #40136866
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx
метод "создал-использовал-почистил" в общем случае мне больше нравится

Есть форма, а есть суть. Гуманитарии уделяют основное внимание форме, но инженеру должно видеть суть. Сутью "почистил" является уборка мусора. Какой мусор убирается во FreeLibrary? Это ложная аналогия, метода создал/использовал/почистил здесь нет.

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

Отдельно забавен вопрос накладных расходов. Постоянная перезагрузка DLL имеет все шансы дополнительно тормозить приложение многократным выполнением ненужных операций. Правда, спасибо дедушке Биллу, винда старается смикшировать эту ошибку разработчиков и подстелить им соломки, но здесь уже как повезёт.
...
Рейтинг: 0 / 0
delphi-7 exe=>dll=>dll release vs free win-10
    #40136878
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx
есть функция
которая грузит длл, вызывает опубликованную функцию и выгружает длл
а та длл может вызываться в общем случае из других длл, вызываемых из этой длл

все это решается, но
метод "создал-использовал-почистил" в общем случае мне больше нравится

"создал-использовал-почистил" - это про управление ресурсами, потенциально совместного использования, в первую очередь - памятью.
И даже в этом случае есть два базовых сценария -
"занял-использовал-освободил" и "занял-использовал-оставил себе в резерве для повторного использования".

Работа с dll - это, в логическом смысле, ближе к работе с удаленным сервером.
"создал-использовал-почистил" тогда сводится к "позвал старт удаленного сервера, обратился с запросом, получил ответ и предложил
серверу завершить свою работу, чтобы при следующем вызове предполагать его полный новый старт".
Это максимально неэффективный способ взаимодействия.
Нельзя, или сложно с разбегу, придумать, как еще больше специально затормозить программу.
Наверно так тоже бывает нужно, но в исключительно специфических случаях.

Обычно "заранее известно", что сервер точно поднят, и задача сводится к вызову фиксированного интерфейса,
с получением ошибки, если на самом деле оно "не поднято".

PS
если есть freelibrary, значит где-то есть loadlibrary и динамическая привязка точек вызова функций dll
Я не знаю ничего про Delphi, но это было бы достаточно неожиданно, если вместо статической привязки в момент старта экзешника,
вам на самом деле нужна динамическая работа с библиотекой.
...
Рейтинг: 0 / 0
delphi-7 exe=>dll=>dll release vs free win-10
    #40136880
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
Я не знаю ничего про Delphi, но это было бы достаточно неожиданно, если вместо статической привязки в момент старта экзешника, вам на самом деле нужна динамическая работа с библиотекой.

Не соглашусь.

Начну с того, что статическая привязка на самом деле нужна редко. Её область - взаимодействие с чужими продуктами, поставляемыми в виде DLL. И кроме стандартных виндовых DLL, использовать её особенно негде. Почему? Потому что чужие продукты, как правило, предоставляют COM-интерфейс, и это существенно удобнее.

Если речь идёт о своих разработках, то существует много вариантов - как их можно подключить в проект. Наиболее прямой и естественный - просто вкомпилировать. Собрать exe, содержащий в том числе эту разработку. И в большинстве случаев это лучший вариант. Когда же свою разработку целесообразно оформить в виде DLL? Точно не в том случае, когда она потом будет статически линковаться. Свои DLL целесообразно делать тогда, когда они содержат плагины. А плагины заведомо подразумевают динамическую линковку, надеюсь, понятно почему.

Наконец, для полноты картины отмечу, что хорошая внутренняя плагин-DLL вообще ничего не экспортирует. Как только в документации написано что-нибудь типа "для подключения как плагин библиотека должна экспортировать функции 1, 2, 3, 4 и 5" - можно смело выписывать архитектору грамоту за профессиональную некомпетентность.
...
Рейтинг: 0 / 0
delphi-7 exe=>dll=>dll release vs free win-10
    #40136884
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Наиболее прямой и естественный - просто вкомпилировать.

В простых случаях да.
Когда-то VBA был "вкомпилирован" в каждое офисное приложение.
А потом кто-то подумал - но ведь у нас их не меньше, чем пяток, и все они могут быть подняты одновременно.
А вдруг мы чуток памяти сэкономим, если будем не "вкомпилировать", а отображать на память конкретного процесса, статически связываясь на старте.

Про плагин - пожалуйста. Он может быть динамически загружаем.
Даже и выгружаем, но вряд ли после каждого обращения к его функционалу, а по специальной педали с надписью - "вот такого мне больше не нать"...
...
Рейтинг: 0 / 0
delphi-7 exe=>dll=>dll release vs free win-10
    #40136887
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
Когда-то VBA был "вкомпилирован" в каждое офисное приложение.
А потом кто-то подумал - но ведь у нас их не меньше, чем пяток, и все они могут быть подняты одновременно.
А вдруг мы чуток памяти сэкономим, если будем не "вкомпилировать", а отображать на память конкретного процесса, статически связываясь на старте.

И для проекта такого масштаба это, безусловно, здравое и верное соображение. Но когда проектируешь велосипед - глупо ставить на него тормоза от Белаза. Решения нужно подбирать сообразно задаче.

booby
Про плагин - пожалуйста. Он может быть динамически загружаем.
Даже и выгружаем, но вряд ли после каждого обращения к его функционалу

Вот с этим я полностью согласен. Постоянные бездумные загрузки-выгрузки - это яркий индикатор карго-культа.
...
Рейтинг: 0 / 0
delphi-7 exe=>dll=>dll release vs free win-10
    #40136898
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
... ставить на него тормоза от Белаза...

🤔
Задумался и полез смотреть, какие у Белаза бывают тормоза.
Оказалось, это тема - целый макрокосм, в котором каждая модель представляет собой, по сути, отдельную планету.
У Сатурнов там и тормозов как таковых нет (кроме стояночных/парковочных) - тормозят приводным электродвигателем,
а у Меркуриев есть и тормоза, сообразно нагрузке, приводные иногда весьма габаритными гидродинамическими конструкциями.

Интересно, когда оно без тормозов правильно работает.
---------------
Содержательно, при связывании на старте - увеличивается время старта.
Для консольных утилит это, вероятно, вред.
Время обращения к "серверу" при этом очевидно лучше не просто "микросервисов", но и обращения через прокси-структуру после динамической загрузки - на уровень косвенности, как минимум, меньше.
Да прямое "вкомпилирование" может выигрывать, но немного, использовать - как тормоза на Белазе - сообразно ситуации.
...
Рейтинг: 0 / 0
delphi-7 exe=>dll=>dll release vs free win-10
    #40137006
bk0010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Наконец, для полноты картины отмечу, что хорошая внутренняя плагин-DLL вообще ничего не экспортирует. Как только в документации написано что-нибудь типа "для подключения как плагин библиотека должна экспортировать функции 1, 2, 3, 4 и 5" - можно смело выписывать архитектору грамоту за профессиональную некомпетентность.
А как с ней работать?
...
Рейтинг: 0 / 0
delphi-7 exe=>dll=>dll release vs free win-10
    #40137011
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bk0010
А как с ней работать?

А как ты хочешь с ней работать? Чего ты от неё хочешь?
...
Рейтинг: 0 / 0
delphi-7 exe=>dll=>dll release vs free win-10
    #40137197
bk0010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
bk0010
А как с ней работать?

А как ты хочешь с ней работать? Чего ты от неё хочешь?
Передать данные и получить результат.
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / delphi-7 exe=>dll=>dll release vs free win-10
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]