Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.058 c
11-1078407548
SkyNet
2004-03-04 16:39
2004.08.08
mck


3-1089613967
VadimKV
2004-07-12 10:32
2004.08.08
Update на основе данных другой таблицы???


14-1090662853
}|{yk
2004-07-24 13:54
2004.08.08
Как сграбить диск с помощью WinAmp 5?


14-1090233197
Dmitrij_K
2004-07-19 14:33
2004.08.08
Мона ли ставить на одной машине несколько Дельфей


14-1090216695
BorisMor
2004-07-19 09:58
2004.08.08
Чем C# лучше VB.NET или Delphi 8





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