![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Уничтожение передаваемых параметров в DLL [D7]
mfender © (2009-07-06 16:02:00)Здравствуйте, Уважаемые.
У меня шибко созрел вопрос: как правильно передать в функцию DLL объект так, чтобы потом грамотно убить сам процесс без убивающего меня Access Violation?
Происходит следующее:
{объявление функций в двух разных DLL}
_Resolve: function(ChR: TChannel): TList;
_GET: function(Resolve: TList): TList;
begin
..................
{Получаем результат из одной функции. ChR - это некая запись (record)}
ResolveList := _Resolve(ChR);
{До сих пор всё работает без ошибок}
..................
{Результат работы передаём следующей функции в другой DLL}
MessageList := _GET(ResolveList);
{Получаем что-то на выходе}
{А вот тут начинается нечно скверное...}
FreeLibrary(_ResolveHandle);
FreeLibrary(_GETHandle);
end;
После уничтожения первого процесса, при попытке уничтожения второго появляется Access Violation. Предположил, что это случается из-за того, что в первом уничтожается так же и ResolveList, который передаётся во вторую функцию. Т.е. его уже нет, а есть попытка его уничтожить.
Вот так я предположил.
Поправьте, если я не прав, и разъясните, как бы этой неприятности избежать?
Anatoly Podgoretsky (2009-07-07 10:16:00) [1]
> mfender (06.07.09 17:55) [5]
> Чудо! Всё заработало!
С чудом сложно бороться.
Григорьев Антон (2009-07-07 10:02:00) [2]
> Ega23 © (07.07.09 09:27) [15]
> А насчёт if Assigned then Free - так это в целях отладки,
> дабы картину увидеть.
Насколько я понимаю, Игорю не нравится предварительная проверка на nil, так как Free её и сам выполнит. Т.е. можно писать просто Free с тем же результатом.
Ega23 (2009-07-07 09:27:00) [3]
> if somedataset.active then somedataset.close,
А какая разница, где эта проверка будет выполнена? В SetActive (который ваапще-то виртуальный и чего он там за собой в потомках дополнительно тащщит - это надо смотреть внимательно), или самим разработчиком?
А насчёт if Assigned then Free - так это в целях отладки, дабы картину увидеть.
И это, насколько я понимаю, отдельная тема отдельной ветки (если похоливарить кому-то охота... :) )
Германн (2009-07-07 01:39:00) [4]
> Игорь Шевченко © (06.07.09 18:44) [12]
>
> Ega23 © (06.07.09 18:33) [11]
>
> всякий раз, когда я вижу код if someobj.assigned then someobj.
> free или if somedataset.active then somedataset.close, моя
> рука тянется к пистолету :)
>
Что-то мне это напоминает?
Но моё воспоминание никак не ассоциируется с тем, что вы подумали, :)
Юрий Зотов (2009-07-06 19:06:00) [5]"Никогда не проверяйте переменные на null, окружающие сразу заметят Вашу неуверенность".
:o)
Игорь Шевченко (2009-07-06 18:44:00) [6]Ega23 © (06.07.09 18:33) [11]
всякий раз, когда я вижу код if someobj.assigned then someobj.free или if somedataset.active then somedataset.close, моя рука тянется к пистолету :)
Ega23 (2009-07-06 18:33:00) [7]
> а подумать, нужен ли такой код ?
Сорри, туплю. Конец дня. :)
Игорь Шевченко (2009-07-06 18:31:00) [8]
> if Assigned(someObj) then FreeAndNil(someObj)
а подумать, нужен ли такой код ?
Ega23 (2009-07-06 18:16:00) [9]
> Просто, думаю, в этом случае вызывалось бы исключение именно
> там, а не в самом конце всего....
Ну пройдись отладчиком, посмотри. Может в FormClose у тебя этот код, а на FormDestroy - тоже что-то убиваешь.
Губо говоря, поставь проверку
if Assigned(someObj) then FreeAndNil(someObj)
Хотя, скорее всего, это тебя не спасёт.
mfender (2009-07-06 18:12:00) [10]
> Где-то какой-то объект пытаешься убить 2 раза. Т.е. один
> раз убил, ссылку не обнилил, потом второй раз пытаешься
> free вызвать.
Попытаюсь ещё протрассировать внимательнее.
Но у меня непосредственно в FormClose в try....except FreeAndNil на несколько объектов стоит, которые работают с самого старта. И вроде нигде не уничтожаются. Хотя, тоже не факт и требуется дополнительная проверка.
Просто, думаю, в этом случае вызывалось бы исключение именно там, а не в самом конце всего....
Ega23 (2009-07-06 18:04:00) [11]
> EInvalidPointer уже после FormClose.
Могу предположить. Где-то какой-то объект пытаешься убить 2 раза. Т.е. один раз убил, ссылку не обнилил, потом второй раз пытаешься free вызвать.
Но - не факт.
mfender (2009-07-06 17:57:00) [12]
> Когда создаёшь новый проект-dll, тебе пишется здоровый комментарий.
да я как-то без мастера писал. поэтому комментария не было ))))
mfender (2009-07-06 17:55:00) [13]Чудо! Всё заработало!
Только теперь всплыла новая порча: EInvalidPointer уже после FormClose.
Но с этим постараюсь разобраться.
Palladin (2009-07-06 17:43:00) [14]Он увеличивает исходный код. И сразу видно - чудопрограммист работает!
Ega23 (2009-07-06 17:29:00) [15]
> А нужно?
Когда создаёшь новый проект-dll, тебе пишется здоровый комментарий.
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
Он не просто так пишется.
mfender (2009-07-06 16:21:00) [16]
> ShareMem везде включен первым модулем ? (в exe и в обеих
> DLL)
Вообще нигде не включён 8-о
А нужно?
Игорь Шевченко (2009-07-06 16:06:00) [17]ShareMem везде включен первым модулем ? (в exe и в обеих DLL)