C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
FormCloseQuery, Странное поведение
Serioja
Отправлено: 14.09.2006, 16:45


Ученик-кочегар

Группа: Участник
Сообщений: 13



Привет всем!
У меня такая проблема:
Приложение состоит из главной формы + пару форм из .dll.
Все работало хорошо пока... не добавил код в функцию FormCloseQuery

if (modif)
{ int i=Application->MessageBox("Сохранить изменения в данном проекте?","Внимание!!!",MB_YESNOCANCEL+MB_DEFBUTTON1);
if (i==6) SaveClick(Sender);
if (i==2) CanClose=false;
}

При закрытии приложения если modif==1 матерится типа: Acces Violation at address ........
Если modif==0 все хорошо
Если у кого есть идеи буду только рад...
__Cheat3r
Отправлено: 14.09.2006, 16:59


Станционный диспетчер

Группа: Участник
Сообщений: 110



Отследи дебаггером, на какой строке вылазиет AV.
Может, проблема совершенно не в FormCloseQuery, а , например, в saveclick'e?
Serioja
Отправлено: 14.09.2006, 17:04


Ученик-кочегар

Группа: Участник
Сообщений: 13



Я это уже далал, но ... увы, дело не в SaveClick-e
__Cheat3r
Отправлено: 14.09.2006, 17:10


Станционный диспетчер

Группа: Участник
Сообщений: 110



Так на какой строке вылазиет AV?
Serioja
Отправлено: 14.09.2006, 17:10


Ученик-кочегар

Группа: Участник
Сообщений: 13



Кстати... матерится строго если были использованы формы из dll
Serioja
Отправлено: 14.09.2006, 17:12


Ученик-кочегар

Группа: Участник
Сообщений: 13



Взлетает на строке деструтора формы — естественно главной
__Cheat3r
Отправлено: 14.09.2006, 17:12


Станционный диспетчер

Группа: Участник
Сообщений: 110



Значит не выгружаешь ДЛЛ, или чтото в этом роде.
__Cheat3r
Отправлено: 14.09.2006, 17:14


Станционный диспетчер

Группа: Участник
Сообщений: 110



QUOTE
Взлетает на строке деструтора формы — естественно главной

Это понятно smile.gif Кхехе.
но там же , в деструкторе, несколько строк.
Serioja
Отправлено: 14.09.2006, 17:15


Ученик-кочегар

Группа: Участник
Сообщений: 13



Но без FormCloseQuery все хорошо!!! или ты считаешь что это побочный еффект?
__Cheat3r
Отправлено: 14.09.2006, 17:20


Станционный диспетчер

Группа: Участник
Сообщений: 110



блин. Выясни из кода, который ты привёл, строку, после которой AV, и покажи её здесь.
Будет проще!

Отредактировано __Cheat3r — 15.09.2006, 03:23
Serioja
Отправлено: 14.09.2006, 17:36


Ученик-кочегар

Группа: Участник
Сообщений: 13



Выяснил:
после END_MESSAGE_MAP
но увы, я думаю это нам не поможет.
Лучше я скажу как выгружаю dll:
Делаю просто FreeLibrary(dllhanle);
Может еще что-то нужно...
Doga
Отправлено: 14.09.2006, 19:21


Мастер участка

Группа: Участник
Сообщений: 575



QUOTE

Лучше я скажу как выгружаю dll


Лучше было бы, если б Вы сплясали yu.gif yahoo.gif

Еще пару таких постов, и можете смело примерять оригиналные погоны, предложенные Gedeon'ом biggrin.gif

Проведите рекомендованные __Cheat3r'ом действия как надо. Поставье точки останова в методах, вызываемых при закрытии форм. Выполняйте код по шагам и смотрите что у Вас там поисходит. Используйте Object Inspector. Учитесь работать с отладчиком.

В конце концов подключите к проэкту Code Guard.

В любом случае, Вы не добьётесь решения Вашей проблемы с помощью остальных участников форума без предоставления для анализа Ваших исходных кодов и текстов возникающих ошибок ...

wink.gif
Serioja
Отправлено: 15.09.2006, 09:32


Ученик-кочегар

Группа: Участник
Сообщений: 13



Ниже прилогаю код. Посмотрите. Может что-то найдете:
Загрузка dll:

DllHandleVars=LoadLibrary("vars.dll");
if( DllHandleVars )
{
CreateFMVars=(TCreateFMVars)GetProcAddress(DllHandleVars,"GetVarsFrm");
CreateFMVars(Application->Handle,code_rtss,main_file,code_type, start_cicle, end_cicle);
}
else
{
ShowMessage("First load library Vars.dll !");
}


Функция GetVarsFrm из dll:

void __stdcall GetVarsFrm(void* hParent,AnsiString cd_path, AnsiString mf,int code,long *start_cicle, long *end_cicle)
{ try{
frmVars = new TfrmVars(hParent,cd_path, mf, code, start_cicle, end_cicle);
frmVars->Show();
frmVars->BringToFront();
}
catch(Exception &e) {
Application->MessageBox(e.Message.c_str(),"Error", MB_OK);
}
}

Функция FormDestroy главной формы main:
void __fastcall TMainForm::FormDestroy(TObject *Sender)
{
if (pJpg)
delete pJpg;
if (DllHandleVars)
FreeLibrary(DllHandleVars);
if (DllHandleTrend)
FreeLibrary(DllHandleTrend);
FreeLibrary(Rtss_int);
DllHandleTrend=NULL;
DllHandleVars=NULL;
}
olegenty
Отправлено: 15.09.2006, 09:54


Ветеран

Группа: Модератор
Сообщений: 2412



Слыш, мэн, а я чё-то не заметил функции, УДАЛЯЮЩЕЙ формы DLL ДО выгрузки DLL.
Вывод: главная форма ПРОДОЛЖАЕТ обращаться к формам DLL, КОГДА ИХ УЖЕ НЕТ (destroyed нахрен).
Serioja
Отправлено: 15.09.2006, 09:58


Ученик-кочегар

Группа: Участник
Сообщений: 13



Поставил я следующие строки перед выгрузкой но не помогает
DestroyWindow(FindWindow("TfrmVars",0));
DestroyWindow(FindWindow("TfrmTrend",0)); sad.gif
Serioja
Отправлено: 15.09.2006, 11:23


Ученик-кочегар

Группа: Участник
Сообщений: 13



Заработало!!!
Создал новую функцию которая закрывает форму длл
void __stdcall FrmVarsClose()
{
frmVars->Close();
delete frmVars;
frmVars=NULL;
}
вызываю ее до выгрузки длл и все хорошо!
Спасибо всем yahoo.gif

Вернуться в Вопросы программирования в C++Builder