powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Access Vialtion ... достал уже, помогите разобраться
12 сообщений из 12, страница 1 из 1
Access Vialtion ... достал уже, помогите разобраться
    #32120867
Фотография 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 ... достал уже, помогите разобраться
    #32120882
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
Попробуй так (в DLL):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
...
var
  OldApp : THandle;

...

procedure ShowDLLForm(hW: THandle, ...);
begin
  OldApp := Application.Handle;
  Application.Handle := hW;
  fDLLForm := TfDLLForm.Create(Application);
  fDLLForm.Show;
...
end;

...

procedure CloseDLLForm;
begin
  fDLLForm.Close;
  fDLLForm.Free;
  Application.Handle := OldApp;
...
end;
...


Имена другие, так как это выдранно из моего проекта, а исправлять влом.
...
Рейтинг: 0 / 0
Access Vialtion ... достал уже, помогите разобраться
    #32120958
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И сильно ты разгрузил? :) Зачем это нужно?
...
Рейтинг: 0 / 0
Access Vialtion ... достал уже, помогите разобраться
    #32120988
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
Не знаю зачем - но ПОМОГАЕТ
...
Рейтинг: 0 / 0
Access Vialtion ... достал уже, помогите разобраться
    #32121038
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 eNose
Да я не тебе :) а aLexx Subb
...
Рейтинг: 0 / 0
Access Vialtion ... достал уже, помогите разобраться
    #32121596
Фотография aLexx Subb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А когда приложение монстр администрировать и заменять компоненты проще. Когда они не в одном exe файле. Например если модуль отчетов точит прекрасно. Чего его трогать. И его можно использовать в другой проге. Чего тут обсуждать. Сделали бы форточки одним exeшником :) Видно ты не занимался серьезными проектами :)
...
Рейтинг: 0 / 0
Access Vialtion ... достал уже, помогите разобраться
    #32121658
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
2 aLexx Subb: в DLL что-нить помещают (обычно) не для того, что бы не трогать работающее. Чаще всего - общие функции. Бывают, конечно и исключения, но зачем тебе понадобилось выносить отчеты в dll-ки, я не понимаю...
...
Рейтинг: 0 / 0
Access Vialtion ... достал уже, помогите разобраться
    #32121937
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как раз я то и занимаюсь такими проектами.
А вот когда ты в конце концов запутаешься во всех своих дополнительных dll и т.п. - чего менял и где, а где и не менял - тогда поймешь, что лучше один файл переписать и отдыхать

И где ты отчеты еще собрался использовать? :)
...
Рейтинг: 0 / 0
Access Vialtion ... достал уже, помогите разобраться
    #32122218
nicnic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуй Sharemem. Поставить в начале своего проекта и проектов Dll'ок. Если не поможет, попробуй вручную освобождать формы создаваемые в Dll. И ещё есть такая вещь - отладка, получаешь ошибку, жмёшь Ctrl+Shift+S (получение стека вызовов), и видишь при освобождении какой переменной она происходит.
...
Рейтинг: 0 / 0
Access Vialtion ... достал уже, помогите разобраться
    #32123538
NightSpider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.proglib.ru/online/delphibook/a26.asp что-то по этой теме было здесь
...
Рейтинг: 0 / 0
Access Vialtion ... достал уже, помогите разобраться
    #32123606
LG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может я что-то не понимаю, но для примера:
для передачи даже обычной строки (передача PChar не рассматриваю) надо выделить память в hostApp и передать указатель в dll и там писать по этому указателю, небольше выделенной длины, а автор запросто передает строки, вариатнты и т.д. Я бы еще понял, если бы использовалать Sharemem, но ее нет.
Немудрено, что >>Access Vialtion ... достал уже
...
Рейтинг: 0 / 0
Access Vialtion ... достал уже, помогите разобраться
    #32124224
Фотография aLexx Subb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А не достаточно описатьтак

Pляля=^Tляля

Tляля=....
....


И передавать Pляля. Зачем память-то выделять?
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Access Vialtion ... достал уже, помогите разобраться
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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