Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Акцес виолейшен в длл [D7, WinXP]


Страницы:   1 2

Deep ©   (2005-08-16 17:53:00) 

в длл, ни с того ни с сего начала возникать ошибка на этой строчке

library mlib;
uses
ShareMem,
SysUtils,
Classes,
Controls,
Forms,
IniFiles,
......
var
IniFileName: string;
......

//вот здесь
IniFileName := ChangeFileExt(Application.ExeName, '.ini');

раньше работало нормально, а сейчас ошибка

в отладчике ExeName показывает имя именно приложения, а не длл, если написать
IniFileName := Application.ExeName + '.ini';
то ошибка(акцес виолейшен) пропадает.
Но тогда возникает ошибка в следующей(столь же банальной строке) строке

IniFile := TIniFile.Create(IniFileName);

это опять какая-то фигня с менеджерами памяти, хотя и в длл и в приложении я уже подключил ShareMem первым в списке.

Причем ситация все больше становится туманной ввиду того, что эта длл уже нормально работала. А перестала работать после того как я внес довольно таки много изменений в код приложения, правда этот измененный код ни коим образом не касается этой длл.

Возможно нужно еще включить какие-то дерективы?
Или увеличить стек?

ShareMem включен первым модулем в оба дпр-а(и приложение, и длл).


Slym   (2005-08-19 05:11:00) [1]

С рантаймами не пользуй шаремем.
И на кой тебе при шаремем и рантаймами PChar?
Открой окно CPU (Alt+Ctrl+C) и трасируй там, если в PluginInfo вызывается LStrClr - то все ясно


--=ХР=--   (2005-08-18 10:50:00) [2]

function QueryOpen(s: PChar): TDataset;

Отстрел башки... Переписать все заново. И забыть о передаче объектов между разными исполняемыми модулями. Только простые типы данных. Или интерфейсы.


Digitman   (2005-08-18 09:07:00) [3]


> sniknik ©   (18.08.05 08:55) [24]


> тип PChar, а где под него выделение памяти?


она уже выделена - в секции инициализированных данных длл-модуля


evvcom   (2005-08-18 08:58:00) [4]

И еще. Автор, используя передачу объектов между exe и dll без компиляции с runtime packages, рискует нарваться на другие "абсолютно непонятные" ошибки. Имея две (или более :) )реализации классов, создавая объект одного класса, а обрабатывая его методами другого, где-нибудь в недрах vcl может встретить конструкцию вида if AnyObject is TAnyObject thenи получить соответственно различные результаты при использовании и не использовании runtime packages. Почему-то на это никто не обращает внимания.


sniknik   (2005-08-18 08:55:00) [5]

Digitman ©   (18.08.05 08:11) [23]
и это не поможет... ;)

у меня почемуто такое впечатление, что он какимито действиями портит код, к примеру пишет данные по "сбитому" указателю, тогда команда на которой возникает исключение это будет фактически то место куда писались данные в код, а ошибка по которой это произошло совершенно в другом месте - где это пишется.

(попытка обьяснить "плавающее" место глюка)

deep
проверь места где работаеш с динамическими переменными массивами, выделение памяти, "ранже чек еррор" проверку включи если выключал, и т.к. это dll то модели вызова процедур сравни в dll   и exe.

вот к примеру, работа с памятью
function PluginInfo: PChar;
begin
PluginInfo := 'Обеспечивает возможность работы клиента с таблицами базы Paradox (с использованием BDE).';
end;
тип PChar, а где под него выделение памяти? куда запишется строка? проверь, замени все PChar на string, ShareMem ты все одно используеш. чего тогда "напрягаться" следить за PChar-ми.


Digitman   (2005-08-18 08:11:00) [6]


> access violation at 0x0040c3d5


собираешь exe-проект со всеми опциями встр.отладки, запускаешь из-под IDE, тут же вызываешь меню Search -> Find Error .., вводишь 0040c3d5 - и дебагер показывает тебе строчку твоего кода, при выполнении которой произошло исключение


deep   (2005-08-17 19:34:00) [7]

если скомпилировать(и приложени, и длл) с runtime-пакетами, то ошибка немного модифицируется
access violation at adress xxxxxxxx in module dcc70.dll
Read of adress xxxxxxxx


deep   (2005-08-17 18:34:00) [8]

access violation at 0x0040c3d5: write of address  0x00030f4c

после поледних изменений в коде вываливается на повторном вызове экспортируемой функции

function PluginInfo: PChar;
begin
PluginInfo := 'Обеспечивает возможность работы клиента с таблицами базы Paradox (с использованием BDE).';
end;


Digitman   (2005-08-17 15:25:00) [9]


> ошибка в сабже описана


где ?


> возникает ошибка


> акцес виолейшен


ЭТО ты называешь "описанием ошибки" ?


deep   (2005-08-17 14:35:00) [10]


>  Акцес виолейшен в длл [D7, WinXP]

а ошибка в сабже описана


Digitman   (2005-08-17 13:04:00) [11]


> ошибка стала вываливыаться


какая ошибка-то ?
гадать будем ?

уж 17 постов в дискуссии, а ТОЧНОЙ инф-ции об ошибке как не было так и нет ...


deep   (2005-08-17 10:02:00) [12]


> Eraser ©   (16.08.05 19:42) [14]

Нет, и еще раз нет :))


> isasa ©
> Database := TDatabase.Create(Application);
> ведь можно
> Database := TDatabase.Create(nil);

согласен, поменял
теперь ошибка стала вываливыаться еще раньше,
на столь же безобидной функции

function PluginInfo: PChar;
begin
 PluginInfo := 'Обеспечивает возможность работы клиента с таблицами базы Paradox (с использованием BDE).';
end;


> Slym ©

удалил, не помогает


Slym   (2005-08-17 04:31:00) [13]

используются старые dcu- удали


isasa   (2005-08-16 20:50:00) [14]

Зачем,

Database := TDatabase.Create(Application);
ведь можно
Database := TDatabase.Create(nil);

ведь совершенно очевидно, что освобождать придется ручками

Database.Close;
Database.Free;

Ведь совершенно очевидно, что Application содержит "левую" ссылку(не nil). Соглашусь на обратное, если кто-то укажет место, где она инициализируется правильным значением.


Eraser   (2005-08-16 19:42:00) [15]

deep ©   (16.08.05 19:39) [13]
// >>>>>>>>>>>>>>>> вылет идет вот здесь >>>>>>>>>>>>>>>>


Дык ошибка тогда тут
Database.Params.Values['ENABLE BCD'] := 'FALSE';


deep   (2005-08-16 19:39:00) [16]

library paradox;
uses
 ShareMem,
 SysUtils,
 Classes,
 Controls,
 Forms,
 IniFiles,
 DB, DBTables, BDE,
 //ReestrUpd in 'ReestrUpd.pas' {fmReestrUpd},
 PlugConfig in 'PlugConfig.pas' {fmPluginConfig};

{$R *.res}

var Database: TDatabase;
   Query: TQuery;
   QueryArray: array of TQuery;

   IniFileName: shortstring;
   Initialized: boolean;
   optDatabase, optUsername, optPassword: string;

procedure PluginInit;
var IniFile: TIniFile;
const
   BdeError = 'Не удается проинициализировать Borland Database Engine (BDE)!';
begin
 //проверим на работоспособность BDE
 if dbiInit(nil) <> DBIERR_NONE then
   Application.MessageBox(BdeError, 'Ошибка');

{
 //если нужно, проапдейтим реестр(БДЕ)
 if not CheckUpdatedFlag then begin
   fmReestrUpd:= TfmReestrUpd.Create(Application);
   try
     fmReestrUpd.ShowModal;
   finally
     fmReestrUpd.Free;
   end;
 end;
}

 //инициализация плугина
 Database := TDatabase.Create(Application); //Application
 Database.Name := 'Database';
 Database.DatabaseName := 'dbDeepOWN';
 Database.LoginPrompt := false;
 Database.DriverName := 'STANDARD';
 Database.Params.Values['DEFAULT DRIVER'] := 'PARADOX';
 Database.Params.Values['ENABLE BCD'] := 'FALSE';

// >>>>>>>>>>>>>>>> вылет идет вот здесь >>>>>>>>>>>>>>>>
 IniFileName := ChangeFileExt(Application.ExeName, '.ini');
 IniFile := TIniFile.Create(IniFileName);

 with Database do begin
   //читаем из ини-файла и присваиваем значения глобальным переменным
   optDatabase := IniFile.ReadString(PluginName, 'Database', '');
   //формируем строку соединения
   Database.Params.Values['PATH'] := optDatabase;
   Open;
 end;

 Query := TQuery.Create(Application);
 Query.DatabaseName := Database.DatabaseName;

 Initialized := true;
end;

.....


deep   (2005-08-16 19:28:00) [17]


> isasa ©

в даном случае мне НЕ нужно чтоб это были действительно "глобальные переменные". Мне нужны именно копии этих переменных. Но суть не в этом, потому как длл будет юзать только одно приложение и доступ к этим переменным из других приложений(или копий этого приложения) впринципе не планируется.


> Юрий Зотов ©
> Попробуйте проинициалировать в DLL еще и глобальную переменную
> Session

весь фокус в том, что до работы с БДЕ в даном случае даже не доходит ход. Вначале в длл я считываю настройки из ини-файла(название базы данных, путь к файлам и т.п.)... вот тут то и подкашивает. Причем не на реальной ошибке, а из-за проблем с управлением памятью....


> Eraser ©   (16.08.05 19:12) [11]

ага, под отладчиком смотрел где вылетает... То что, на нормально написаной строке вылетает - это уже понятно. Смотрел регистры поцессора: видно как при каком-то из "call -$00006463" регистр ESP(стек) уходит за допустимые пределы. Вот почему?


Eraser   (2005-08-16 19:12:00) [18]

deep ©

Надо просматривать весь код, начиная с момента, который "инициирует" действия в [0].
Т.е. например инициатором может быть нажатие какой-то кнопки или реакция на какое-то событие, вам виднее.


Юрий Зотов   (2005-08-16 19:12:00) [19]

> Deep

Попробуйте проинициалировать в DLL еще и глобальную переменную Session (значением из EXE).

Либо наооборот (если сессия открывается в DLL). В общем, Session при работе с BDE должен быть везде один и тот же (подобно Application и Screen).


isasa   (2005-08-16 19:12:00) [20]

Выдержка из Delphi help-а


Global variables in a library
Global variables declared in a shared library cannot be imported by a Delphi application.

A library can be used by several applications at once,
but each application has a copy of the library in its own process space with its own set of global variables.
For multiple libraries--or multiple instances of a library--to share memory, they must use memory-mapped files.
Refer to the your system documentation for further information.

ИМХО. Убирать глобальные переменные

var Database: TDatabase;
  Query: TQuery;
  QueryArray: array of TQuery;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо