Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1246881220
ford
2009-07-06 15:53
2009.09.06
скопировать заблокированный файл


15-1247067931
Артур Пирожков
2009-07-08 19:45
2009.09.06
Про систему ЕГАИС


15-1246918524
DVM
2009-07-07 02:15
2009.09.06
Функция обратного вызова с переменным числом параметров.


2-1246958245
sashbc
2009-07-07 13:17
2009.09.06
vcl видимо


1-1213790875
master_root
2008-06-18 16:07
2009.09.06
переопределение операций(сложение, вычитание...)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский