Форум: "Основная";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];
ВнизДиалоги из DLL Найти похожие ветки
← →
афвуд (2004-07-27 10:44) [0]В общем из основой программы вызывается функция дллная, которая в свою очередь создаёт TSaveDialog(или TOpenDialog) показывает его(Execute) и потом уничтожает. Проблемы примерно после пятого по счёту вызова этой функции. НАчинает вываливаться Access Violation. При чём не всегда после вызова функции. Иногда несколько раз её вызвав тыкаешься на элементе каком-нибудь на формочке - опять Access Violation. Чувствую эти диалоги как-то портят память, выделенную для приклады.
Приложение MDI. Я думаю именно из-за этого все проблемы.
Может кто сталкивался и поборол это?
← →
MU © (2004-07-27 10:46) [1]параметры функции?
← →
афвуд (2004-07-27 10:51) [2]Понимаешь из проги вызывается куча функций с таким же набором параметров, и если не вызывать эти диалоги, то всё ок. ТАк что я думаю дело не в этом.
P.S. Насчёт того что со String возникают проблемы я знаю. Передаю char *(Pchar) и void *(Pointer) и всё.
← →
MU © (2004-07-27 10:56) [3]Application.Handle + F1 почитайте, может, поможет?
← →
Гаврила © (2004-07-27 11:00) [4]Application.Handle + F1 не поможет в данном случае
> афвуд
пока вы не приведете код функций с диалогами, и код их вызовов, никто ничего по делу не скажет, экстрасенсов тут нет
← →
афвуд (2004-07-27 11:15) [5]
> Application.Handle + F1 не поможет в данном случае
Да не помогло.
Привести текст функции можно... там у меня просто - это плагин. И там будет много ненужного. Я постараюсь вырезать всё ненужное.
Вот фунцкция которая вызывает:
void __fastcall SPluginManager::Execute(String Func, SFormManager * Manager)
{
void (__stdcall *Exec)(void (*ptr),void (*ptr2),void (*ptr3));
Exec = (void(__stdcall *) (void (*ptr),void (*ptr2),void (*ptr3)))GetProcAddress(dllp, "Exec");
if(Exec) Exec(Manager,GetPoint,Func.c_str());
}
Вот функция, которая принимает вызов:extern "C" void __export __stdcall Exec(void *Manager,void *PGetPoint,char *PStr)
{
TStringList *lis=new TStringList;
lis->Text=String(PStr);
TPars *Pars=new TPars;
try
{
Pars->p=Manager;
for(int i=0;i<lis->Count;i++)
{
Pars->Pars(lis->Strings[i]);
}
}
catch(Exception &E)
{
ShowMessage(E.Message);
}
delete Pars;
delete lis;
Главное в предыдущей функции, это вызовы методов Pars для каждой из полученных строк(там на самом деле передаётся StringList ввиде одной строки).
Вот этот метод Pars:
void TPars::Pars(String s)
{
TStringList *strs=ParsOneString(s);
void (__fastcall *fun)(TStringList * lis);
TMethod m;
m.Code=this->MethodAddress(strs->Strings[0].LowerCase());
m.Data=this;
SetMethodProp(this,"ExecutingFunction",m);
if(m.Code)ExecutingFunction(strs);
else ShowMessage("Неверная функция : "+strs->Strings[0]);
delete strs;
}
ЗДесь ошибок можно не искать этот механизм безотказно работает уже год :) . Главное здесь ищется функция нужная и вызывается если такая есть.void __fastcall TPars::savedialog(TStringList * lis)
{
TSaveDialog *OD=new TSaveDialog(Form);
OD->Filter=lis->Strings[2];
OD->Options= TOpenOptions() << ofOverwritePrompt ;
if(OD->Execute())
{
this->SetVar(p,lis->Strings[2].c_str(),OD->FileName);
}
delete OD;
}
Вот. После вызова этой функции несколько раз(обычно пяти раз хватает) получается облом.
← →
ssk © (2004-07-27 11:30) [6]что за функция такая SetVar, которая используется после запуска диалога? SetVar(p,lis->Strings[2].c_str(),OD->FileName);
может в ней что-то?
← →
афвуд (2004-07-27 11:53) [7]Это Указатель на функцию главной проги.
Нет. Она нормально работает когда вызывается из других функций.
← →
MU © (2004-07-27 12:05) [8]TSaveDialog *OD=new TSaveDialog(Form);
Это кто такая?
← →
афвуд (2004-07-27 12:09) [9]А ну это мы пробовали Owner для этого диалога делать форму главной приклады(Сначала Owner"ом был NULL(nil)). НЕ помогло.
Form - это указатель на эту форму. Он выпрашивается плагином у приклады.
← →
ssk © (2004-07-27 12:13) [10]может проблема в распределении памяти? попробуй ShareMem подключить.
← →
Гаврила © (2004-07-27 12:20) [11]Нет, овнером форму главной проги делать нельзя - начнется хаос с управлением памятью
Только в случае ShareMem или сборки с пакетами
так что NULL (nil)
← →
ssk © (2004-07-27 12:23) [12]если он сделает родителем null, то при показе диалога на панели задач может появиться кнопка, что не есть хорошо.
← →
афвуд (2004-07-27 12:39) [13]ShareMem не помог.
А споры насчёт того кем лучше делать Owner - бесполезны. ТАк как не работает ни так ни эдак. Вылезает ошибка одна и та же при этом.
← →
ssk © (2004-07-27 12:46) [14]а ты ShareMem и в основном проекте и в DLL ставил?
З.Ы. данный вопрос прошу расценивать не как издевательство.
← →
MU © (2004-07-27 12:48) [15]Вылезает ошибка и при OK (if(OD->Execute())) и при отказе от сохранения?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.035 c