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 | Взлетает на строке деструтора формы — естественно главной |
Это понятно Кхехе.
но там же , в деструкторе, несколько строк. |
|
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
|
Лучше было бы, если б Вы сплясали
Еще пару таких постов, и можете смело примерять оригиналные погоны, предложенные Gedeon'ом
Проведите рекомендованные __Cheat3r'ом действия как надо. Поставье точки останова в методах, вызываемых при закрытии форм. Выполняйте код по шагам и смотрите что у Вас там поисходит. Используйте Object Inspector. Учитесь работать с отладчиком.
В конце концов подключите к проэкту Code Guard.
В любом случае, Вы не добьётесь решения Вашей проблемы с помощью остальных участников форума без предоставления для анализа Ваших исходных кодов и текстов возникающих ошибок ...
|
|
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)); |
|
Serioja |
Отправлено: 15.09.2006, 11:23 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 13
|
Заработало!!!
Создал новую функцию которая закрывает форму длл
void __stdcall FrmVarsClose()
{
frmVars->Close();
delete frmVars;
frmVars=NULL;
}
вызываю ее до выгрузки длл и все хорошо!
Спасибо всем |
|