Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Access Vialtion ... достал уже, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
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; Помогите. Заранее благодарен. Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2003, 09:21 |
|
||
|
Access Vialtion ... достал уже, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
Я тут в Дельфе прочел "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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2003, 14:30 |
|
||
|
Access Vialtion ... достал уже, помогите разобраться
|
|||
|---|---|---|---|
|
#18+
В dll можно без проблем использовать стандартные компоненты Delphi. Это знаю на личном опыте, так как работаю с этим. FastReport в библиотеке мне не удалось запустить, в итоге он живет в основном приложении. Теперь в общем по обмену данными с библиотекой. variant и string у меня не передавались и тому есть достойное объяснение. В данном случае нужно работать с типом PChar. В библиотеке может вестись прообразование типов но обмен доженбыть через них. Преобразование string -> PChar должно осуществляться функцией StrLCopy обраное можно str:=string(ch). AV-ошибка возникает чаще всего в данной ситуации когда библиотека выделяет пямять а приложение ее освобождает или наоборот. При передаче и типов string или variant происходит перераспределение памяти причем происходит именно заперенная ситуация, когда один выделяет, а другой освобождает и получаем AV. Вот в принципе и все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2003, 05:49 |
|
||
|
|

start [/forum/topic.php?fid=58&gotonew=1&tid=2118896]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
56ms |
get topic data: |
8ms |
get first new msg: |
5ms |
get forum data: |
2ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 271ms |
| total: | 407ms |

| 0 / 0 |
