Форум: "Основная";
Текущий архив: 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.007 c