powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Access Vialtion ... достал уже, помогите разобраться
4 сообщений из 4, страница 1 из 1
Access Vialtion ... достал уже, помогите разобраться
    #32120864
Фотография aLexx Subb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Access Vialtion at adress ... достал конкретно.
Итак было проблем больше, но устранил частично.
Ляпою приложение, достаточно громоздкое. В своей работе использую ADO,
Fast Report 2.47 Delphi 7 и MS SQL 2000. Приложение сделал в одном exe файле, отладил, все
работало. Не было проблем блин сделал, но нужно. Первым делом разгрузил экзешник отчетами.
Вынес все компоненты отчетов в dll и вызываю печать просмотр и дизайн через внешние процедуры.
Все вызывалось, все работало, пока не закрывал приложение. Появлялся AV! Сломал голову.
На формуе FR нашел только, что якобы нужно делать frGlobals.free при ликвидации. Но блин куда не тыкал не помогло.
Решил я енту проблему частично принудительной загрузкой и выгрузкой библиотек. Опосля FreeLibrary(...) выход из программы,
был чистым, но если я не вызываю дизайнер отчетов. Просмотр и печать без глюков, а дизайнер фигня.

1. Помогите решить проблему с вызовом дизайнера Fast Report в dll и корректным завершением. Может секрет какой есть.
Может кто пример скинет.

Проблема другая. На дизайнер пока плюнул, закоментировал. Стал выносить в dll формы справоников и обнаружил такой же AV при
завершении. Формы содержат TADOQuery, TDataSet, TTreeView и TDBGridEh.

2. При работе с TDBGridEh или с TTreeView (не важно) в dll при закрытии приложения AV лезет!
Если просто заполнить Grid или дерево данными полазить по нему все работает верно, а стоит только передать данные
назад в форму вызвавшую справоник, сразу не вылезает гемора, а вот когда приложение закроешь то попрет AV.

Handle в Dll передаю.

Я передаю указатель в dll на соединение с серваком из главной формы и возвращаю указатель на струкутру данных типа
запись из двух полей код и название. Думал указатели дело портят, но вот не указатели вроде, а что-то другое.
Может секрет какой есть.


Вот пример функции вызова

function ShowGroupDoc(AHandle:THandle;pCon:PADOConnection;vSklad:PSklad;vGroup:PGroupDoc):boolean;export;

AHandle передаю Application.Handle

См далее ...

Вот пример структур
-------------------------------------------------------------
type
PSklad=^TSklad;
TSklad=record
UID:Variant;
Name:string;
Like:string;
end;

PGroupDoc=^TGroupDoc;
TGroupDoc=record
UID:Variant;
Name:string;
Like:string;
end;

TReference=record
Ok:boolean;
UID:variant;
Name:string;
end;


Вот так обзываю нужную мне внешнюю функцию
-------------------------------------------------------------
TShowGroupDoc=function (AHandle:THandle;pCon:PADOConnection;pSklad:PSklad;pGroup:PGroupDoc):boolean;


Вот так подгружаю библиотеку
-------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
//Подгружаем библиотеку со справочниками
ReferencesHandle := LoadLibrary('REFERENCES.DLL');
if ReferencesHandle = 0 then
MessageBox(Application.Handle,'Ошибка загрузки библиотеки references.dll','О Ш И Б К А',MB_ICONERROR);

end;


Вот так при уничтожении формы выгружаю
-------------------------------------------------------------
procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeLibrary(ReferencesHandle);
end;



Вот пример вызова из главной формы
--------------------------------------------------------
Function GetGroupDoc:TReference;
begin
Result.Ok:=false;
@ShowGroupDoc := GetProcAddress(ReferencesHandle, 'ShowGroupDoc');
if @ShowGroupDoc<> nil then
begin
if ShowGroupDoc(Application.Handle,@Form1.c1,@vSklad,@vGroupDoc) then
begin
//Возвращаем результаты
Result.Ok:=true;
Result.UID:=vGroupDoc.UID;
Result.Name:=vGroupDoc.Name;
end
end
else
MessageBox(Application.Handle,'Ошибка вызова процедуры ShowGroupDoc!','О Ш И Б К А',MB_ICONERROR)

end;

Вот так описана dll функция
----------------------------------------------------------

function ShowGroupDoc(AHandle:THandle;pCon:PADOConnection;vSklad:PSklad;vGroup:PGroupDoc):boolean;export;
...
implementation
...

function ShowGroupDoc;
begin
Application.Handle:=AHandle;
Result:=false;
Form_GroupDoc:=TForm_GroupDoc.create(Application);
vUID_Sklad:=vSklad.UID;
with Form_GroupDoc do
begin
// установка подключения
q1.Connection:=pCon^;
q_update.Connection:=pCon^;
end;
try
if Form_GroupDoc.ShowModal =mrOk then
begin
vGroup.UID:=vUID_Group; //Возвращаю значение выбранное из TreeView назад по указателю в главную форму. Может здесь гемор!!!
vGroup.Name:=vName_Group;
Result:=true
end;
finally
Form_GroupDoc.Free
end
end;



Помогите.

Заранее благодарен. Алексей.
...
Рейтинг: 0 / 0
Access Vialtion ... достал уже, помогите разобраться
    #32121179
Sunny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я тут в Дельфе прочел
"You cannot pass runtime type information (RTTI) across DLLs or from a DLL to an executable. That’s because DLLs all maintain their own symbol information. If you need to pass a TStrings object from a DLL then using an is or as operator, you need to create a package rather than a DLL. Packages share symbol information."

и еще:
"On Windows, if a DLL exports routines that pass long strings or dynamic arrays as parameters or function results (whether directly or nested in records or objects), then the DLL and its client applications (or DLLs) must all use the ShareMem unit. The same is true if one application or DLL allocates memory with New or GetMem which is deallocated by a call to Dispose or FreeMem in another module. ShareMem should always be the first unit listed in any program or library uses clause where it occurs."

Так что, по-моему, не стоит помещать компоненты в DLL.
...
Рейтинг: 0 / 0
Access Vialtion ... достал уже, помогите разобраться
    #32121636
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В dll можно без проблем использовать стандартные компоненты Delphi. Это знаю на личном опыте, так как работаю с этим. FastReport в библиотеке мне не удалось запустить, в итоге он живет в основном приложении. Теперь в общем по обмену данными с библиотекой. variant и string у меня не передавались и тому есть достойное объяснение. В данном случае нужно работать с типом PChar. В библиотеке может вестись прообразование типов но обмен доженбыть через них. Преобразование string -> PChar должно осуществляться функцией StrLCopy обраное можно str:=string(ch). AV-ошибка возникает чаще всего в данной ситуации когда библиотека выделяет пямять а приложение ее освобождает или наоборот. При передаче и типов string или variant происходит перераспределение памяти причем происходит именно заперенная ситуация, когда один выделяет, а другой освобождает и получаем AV. Вот в принципе и все.
...
Рейтинг: 0 / 0
Access Vialtion ... достал уже, помогите разобраться
    #32121638
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорри, я тут уточнил, string передавать можно, но далее работать с ним нельзя. ТОесть можно считать с него данные и все.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Access Vialtion ... достал уже, помогите разобраться
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]