![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Акцес виолейшен в длл [D7, WinXP]
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?