Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];

Вниз

DLL and private/public (Вопрос большой)   Найти похожие ветки 

 
asafr   (2003-04-04 16:35) [0]

Работаю с проектом, опыт работы с DLL не колоссальный. Написал библиотеку. Библиотека работала нормально до тех пор, пока не вставил туда модуль, работающий с компонентами вкладки Servers. Компоненты создаются динамически. Модуль отрабатывает, открывается отчет созданый в Ворде. Я его закрываю, затем закрываю форму, вызванную из библиотеки, а после закрываю главную форму. И вот тут выскакивает сообщение с CPU индикатором:"Project C:\.....\Petrobord.exe fauled with message "access violation at 0x0012fee1: write of address 0xb5783ef7. Process Stopped/ Use Step or Run to continue". Далее.. В модуле библиотеки никак не могу объявить в private/public компоненту TWordApplication (да и другие переменные)?... То есть при компиляции, все проскакивает, но при Run, дойдя до этого компонента пишет "Access Violation...". Если это дело объявить глобальной переменной - все работает.....
Понятно, что скорее всего это проистекает из проблеммы (цитирую выдержку):"В Win32 при завершении процесса вся отведенная в его адресном пространстве память освобождается. Если DLL в Win32 выделила память, то последняя принадлежит потоку, вызвавшему функцию DLL, которая провела это выделение. Т.к. поток - часть процесса, память принадлежит процессу. Следствие - память не будет автоматически освобождена при выгрузке модуля DLL, т.к. она ему не принадлежит. Это произойдет при завершении процесса."
Но я ничего не могу поделать... Люди, те, кто с DLL-ками на дружеской ноге: помогите!!! Ведь наверняка кто-нибудь сталкивался с этой проблемой и постоянно работающие с DLL обходят или ликвидируют эту проблему...
Надо заметить, что этот же самый код вне DLL работает отлично...


 
asafr   (2003-04-04 16:39) [1]

ИЗВИНИТЕ ЗА ДУБЛИРОВАНИЕ ВОПРОСА. ТАК СРАБОТАЛО - Я НЕ ВИНОВАТ. ПИШИТЕ ВО ВТОРУЮ ТЕМУ ВО ИЗБЕЖАНИЯ ПУТАНИЦЫ
с УВАЖЕНИЕМ, Сафронов Андрей


 
Владислав   (2003-04-04 16:58) [2]

Ну во первых, вообще не понятно, при чем здесь потоки?
Во вторых, при чем здесь выделение памяти?
В третьих, где здесь вопрос, собственно? :))
Access violation - это, иными простыми словами, обращение к памяти, к которой обращаться нельзя (ОС запрещает). Так что она (ошибка) мало связана с потоками и освобождением памяти после завершения процесса.
Ну а теперь спрашивайте :)


 
asafr   (2003-04-04 17:12) [3]

Спасибо, Владислав...


 
Владислав   (2003-04-04 17:20) [4]

Не за что, Андрей.
Могу подробнее. Ты где то не выделил память, а пытаешься к ней обратиться (это мало вероятно), или память уже освободил, но еще пытаешься с ней работать. Такие ошибки не просто ловить даже когда у тебя перед глазами собственный код (в этом ты наверное уже убедился). И еще сложнее, клгда у тебя нет чужого кода.
Как ты думаешь, что тебе еще можно сказать?
Ты бы уточнил ситуацию, и спросил бы как с ней бороться (и побыстрее, а то до понедельника ждать придется)...


 
asafr   (2003-04-04 17:39) [5]

Мне кажется, что ошибка в следующем... Хотя это только догадка...
1)При помощи DLL cоздается Microsoft Word Object...
2)Так как WordApplication объявлена у меня глобальной переменной (иначе у меня почему то не получается), то программа не может четко определить кому этот объект принадлежит.
После закрытия DLL этот объект удаляется.
3)А потом, при закрытии главной формы - происходит вторая попытка удалить объект. Отсюда "Access Violation"...

Все пункты (особенно второй), конечно, может и неверены, но я так думаю... Потому что мысли все по этому вопросу уже давно иссякли...


 
Владислав   (2003-04-04 18:30) [6]

Ну ты сам пишешь, что удаляешь объект WordApplication дважды. Выбери для себя правило, кто будет отвечать за время жизни объекта (приложение или dll) и четко ему следуй. Ну и, естественно, не пытайся работать с ним, если объект, который отвечает за время жизни твоего WordApplication, выгружен из памяти (в случае с dll). Больше тут нечего сказать.
Можно только посоветовать. Создай две процедуры (это в самом простом случае). Одна для создания объекта, другая для разрушения. Создавай и разрушай объект только с помощью этих процедур. В них, при создании устанавливай флаг, при разрушении сбрасывай. Вот тебе и проверка, существует объект или нет. Все это будет справедливо, если объект за время работы программы может быть только в единичном экземпляре. Этот совет легко расширить с учетом множественности. Ну а после таких изменений глобальный поиск по всем проектам и замена всех комманд по созданию объектов на вновь созданные процедуры. В общем, немного фантазии к совету, и получится легко отлаживаемый код.
Еще можно добавить вот что. Проверь, работаешь ли ты со строками в dll и приложении (наверняка да). Так вот не используешь ли ты строки, память под которые выделил в dll, в основном приложении, и наоборот. Если да, то не забывай про ShareMem.pas.


 
asafr   (2003-04-07 10:43) [7]

Спасибо, Владислав!
Попробую применить твои пожелания на практике...
По поводу ShareMem.pas - об этом я не забываю....



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.008 c
3-54462
anatolyk
2003-03-29 11:42
2003.04.17
ADOConnection.ConnectionString при переносе проги.


14-54851
ArtemB
2003-03-31 09:11
2003.04.17
Выделение строк


14-54857
kravchuk
2003-04-01 18:26
2003.04.17
compiler magic


6-54777
Bosh
2003-02-21 04:36
2003.04.17
RAS


14-54821
Opuhshii
2003-03-31 20:01
2003.04.17
Очень нехоршие люди!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский