Форум: "Начинающим";
Текущий архив: 2009.09.06;
Скачать: [xml.tar.bz2];
ВнизУничтожение передаваемых параметров в DLL Найти похожие ветки
← →
mfender (2009-07-06 16:02) [0]Здравствуйте, Уважаемые.
У меня шибко созрел вопрос: как правильно передать в функцию 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, который передаётся во вторую функцию. Т.е. его уже нет, а есть попытка его уничтожить.
Вот так я предположил.
Поправьте, если я не прав, и разъясните, как бы этой неприятности избежать?
← →
Игорь Шевченко © (2009-07-06 16:06) [1]ShareMem везде включен первым модулем ? (в exe и в обеих DLL)
← →
mfender (2009-07-06 16:21) [2]
> ShareMem везде включен первым модулем ? (в exe и в обеих
> DLL)
Вообще нигде не включён 8-о
А нужно?
← →
Ega23 © (2009-07-06 17:29) [3]
> А нужно?
Когда создаёшь новый проект-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. }
Он не просто так пишется.
← →
Palladin © (2009-07-06 17:43) [4]Он увеличивает исходный код. И сразу видно - чудопрограммист работает!
← →
mfender (2009-07-06 17:55) [5]Чудо! Всё заработало!
Только теперь всплыла новая порча: EInvalidPointer уже после FormClose.
Но с этим постараюсь разобраться.
← →
mfender (2009-07-06 17:57) [6]
> Когда создаёшь новый проект-dll, тебе пишется здоровый комментарий.
да я как-то без мастера писал. поэтому комментария не было ))))
← →
Ega23 © (2009-07-06 18:04) [7]
> EInvalidPointer уже после FormClose.
Могу предположить. Где-то какой-то объект пытаешься убить 2 раза. Т.е. один раз убил, ссылку не обнилил, потом второй раз пытаешься free вызвать.
Но - не факт.
← →
mfender (2009-07-06 18:12) [8]
> Где-то какой-то объект пытаешься убить 2 раза. Т.е. один
> раз убил, ссылку не обнилил, потом второй раз пытаешься
> free вызвать.
Попытаюсь ещё протрассировать внимательнее.
Но у меня непосредственно в FormClose в try....except FreeAndNil на несколько объектов стоит, которые работают с самого старта. И вроде нигде не уничтожаются. Хотя, тоже не факт и требуется дополнительная проверка.
Просто, думаю, в этом случае вызывалось бы исключение именно там, а не в самом конце всего....
← →
Ega23 © (2009-07-06 18:16) [9]
> Просто, думаю, в этом случае вызывалось бы исключение именно
> там, а не в самом конце всего....
Ну пройдись отладчиком, посмотри. Может в FormClose у тебя этот код, а на FormDestroy - тоже что-то убиваешь.
Губо говоря, поставь проверкуif Assigned(someObj) then FreeAndNil(someObj)
Хотя, скорее всего, это тебя не спасёт.
← →
Игорь Шевченко © (2009-07-06 18:31) [10]
> if Assigned(someObj) then FreeAndNil(someObj)
а подумать, нужен ли такой код ?
← →
Ega23 © (2009-07-06 18:33) [11]
> а подумать, нужен ли такой код ?
Сорри, туплю. Конец дня. :)
← →
Игорь Шевченко © (2009-07-06 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) [13]"Никогда не проверяйте переменные на null, окружающие сразу заметят Вашу неуверенность".
:o)
← →
Германн © (2009-07-07 01:39) [14]
> Игорь Шевченко © (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, моя
> рука тянется к пистолету :)
>
Что-то мне это напоминает?
Но моё воспоминание никак не ассоциируется с тем, что вы подумали, :)
← →
Ega23 © (2009-07-07 09:27) [15]
> if somedataset.active then somedataset.close,
А какая разница, где эта проверка будет выполнена? В SetActive (который ваапще-то виртуальный и чего он там за собой в потомках дополнительно тащщит - это надо смотреть внимательно), или самим разработчиком?
А насчёт if Assigned then Free - так это в целях отладки, дабы картину увидеть.
И это, насколько я понимаю, отдельная тема отдельной ветки (если похоливарить кому-то охота... :) )
← →
Григорьев Антон © (2009-07-07 10:02) [16]
> Ega23 © (07.07.09 09:27) [15]
> А насчёт if Assigned then Free - так это в целях отладки,
> дабы картину увидеть.
Насколько я понимаю, Игорю не нравится предварительная проверка на nil, так как Free её и сам выполнит. Т.е. можно писать просто Free с тем же результатом.
← →
Anatoly Podgoretsky © (2009-07-07 10:16) [17]
> mfender (06.07.09 17:55) [5]
> Чудо! Всё заработало!
С чудом сложно бороться.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.09.06;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c