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 включен первым модулем в оба дпр-а(и приложение, и длл).


Alexander Panov   (2005-08-16 18:59:00) [21]

deep ©   (16.08.05 18:54) [7]

Все же приведи побольше кода.

А еще подумай, может быть Application вовсе не создан объект в DLL?
Если надо получить имя пути, где находится DLL, используй такой метод:

function CPath: String;
var
   p: array[0..1024] of Char; // или [0..MAX_PATH+1]
   n: Integer;
begin
   n := GetModuleFileName(HINSTANCE,@p[0],1024);
   Result := '';
   if n>0 then
   begin
       SetLength(Result,n);
       Move(p[0],Result[1],n);
   end;
end;

...

   CGIPath := ExtractFilePath(CPath);


deep   (2005-08-16 18:54:00) [22]


> isasa ©

если бы дело было именно в Application, я бы так и сделал. Но проблема более масштабная. Я могу закоментировать этот код вообще, ошибка лезет через пару строчек ниже.


isasa   (2005-08-16 18:49:00) [23]

А не проще передавать параметром имя ini файла в процедуру(функцию) библиотеки, и не искать где чей  Application.
Что, кстати логичней.


deep   (2005-08-16 18:38:00) [24]


> TUser ©

не первый год замужем. :))

Суть такова: из приложения нужно было вынести в длл работу с БДЕ(TDatabase, TQuery) и оставить только работу с результирующими наборами(TDataset). Что собственно я и сделал. В результате избавился в приложении от модуля dbtables и испульзую только db.
В длл используется и тот и другой. Пробовал однако добавть модуль dbtables в приложение -- проблемы не решает.

И еще в главном приложении часть констант оформил в секцию resorcestring. Возможно это тоже могло как то косвенно повлиять?

Все.


TUser   (2005-08-16 18:19:00) [25]

Когда ошибки возникают на совершенно 'чистых' строках - типичный пример того, что ошибка в другом месте. Вспоминай, - после какого изменения программы появился баг.


deep   (2005-08-16 18:16:00) [26]

в длл используются модули

uses
 ShareMem,
 SysUtils,
 Classes,
 Controls,
 Forms,
 IniFiles,
 DB, DBTables, BDE;

а также используются глобальные переменные

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

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

function QueryOpen(s: PChar): TDataset;

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


deep   (2005-08-16 18:08:00) [27]


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


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

Deep ©   (16.08.05 17:53)

Возможно объект Application для ДЛЛ не проинициализирован. Возникает ли ошибка если обратиться к другим полям Application?


Страницы:   1 2

Наверх

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