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

 
Access violation в dll, проблема...
Shagg
Отправлено: 10.12.2006, 09:10


Дежурный стрелочник

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



Всем привет!!! У меня есть dll'ка, в которой хранятся все отчетные формы. Вот функция, которая экспортируется из длл:
CODE
extern "C"
{
__declspec(dllexport) void ShowRep(Classes::TComponent *AOwner, AnsiString RepName, TDateTime Date)
{
 TReportForm *f = new TReportForm(AOwner);
 f->showrep(RepName, Date);
 delete f;
}
}

А эта функция собственно выводит отчет:
CODE
void __fastcall TReportForm::showrep(AnsiString repname, TDateTime Date)
{
 TQuickRep *rep;
 if ((rep = dynamic_cast<TQuickRep*>(FindChildControl(repname))) == NULL)
   return;
 ADOQuery1->Active = false;
 ADOQuery1->SQL->Clear();
 ADOQuery1->SQL->AddStrings(rep->Description);
 int pos;
 AnsiString dt = FormatDateTime("mm.dd.yyyy hh:nn", Date);
 AnsiString str;
 for (int i=0; i<ADOQuery1->SQL->Count; i++)
 {
   str = ADOQuery1->SQL->Strings[i];
   while ((pos = str.AnsiPos("<date>")) > 0)
   {
     str.Delete(pos, 6);
     str.Insert("'"+dt+"'", pos);
   }
   ADOQuery1->SQL->Strings[i] = str;
 }
 ADOQuery1->Active = true;
 rep->Preview();
}

В свойстве Description кажлого QuickReport'а хранится шаблон запроса.
Проблема в том, что при закрытии Preview'а вываливается AV. Но, если поставить после строки "f->showrep(RepName, Date);" ShowMessage ничего подобного не происходит. Кто нибудь с подобным встречался? и как с этим бороться???
olegenty
Отправлено: 10.12.2006, 11:43


Ветеран

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



1. явно укажи стандарт вызова как в самой DLL, так и при получении указателя на функцию в DLL (__stdcall, __fastcall, __cdecl, __pascal) — это для уверенности, что стек правильно чистится после вызова функции
2. разбор "полёта" с  — детский лепет, существуют параметрические запросы, так вот именно ими и надо пользоваться
3. ADOQuery1 остаётся открытым. зачем? (я вижу, что он закроется при удалении формы, которое тут же и последует, однако не во всех случаях бывает именно так, и лучше писать универсальный правильный код)

внешне ошибки не видно
Romikgy
Отправлено: 10.12.2006, 13:26


Дежурный стрелочник

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



Измени этот вызов
__declspec(dllexport) void ShowRep(Classes::TComponent *AOwner, AnsiString RepName, TDateTime Date)
на что то типа
__declspec(dllexport) void ShowRep(Classes::TComponent *AOwner, char * RepName, TDateTime Date)

PS да и вообще пытайся в dll передавать ссылки а не сами объекты , имхо

Отредактировано Romikgy — 10.12.2006, 13:27
Shagg
Отправлено: 11.12.2006, 17:54


Дежурный стрелочник

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



Всем спасибо. Заработало yahoo.gif

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