![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
FreeLibrary [D7, Win95/98, WinXP]
kblc © (2005-05-26 07:13:00)Уважаемые мастера, почему такая фигня происходит???
if p.Loaded then
begin
p.UpLoad;
if not p.UpLoaded then
Server[LOG_SERVER].ExecFunction('LOG '+format('"%s": невозможно выгрузить библиотеку (%s)',[Name,Copy(p.FileName,LastDelimiter('\',p.FileName)+1,length(p.FileName))]));
end;
p.Destroy;
....
end;
вот функция p.UpLoad:
procedure TLibrary.UpLoad;
begin
if Loaded then
begin
if Assigned(ExecFunction) then ExecFunction('STOP');
prUpLoaded:=FreeLibrary(LibHandle);
end else prUploaded:=true;
end;
функция выполняеться замечательно prUploaded = TRUE, но, как только переходим на след. строку
if not p.UpLoaded then
тоpкак такавое"Inaccesible Type"
Почему так получаеться?
Digitman (2005-05-26 12:32:00) [41]
> что за ОБС ????
Одна Баба Сказала
kblc (2005-05-26 12:21:00) [42]что за ОБС ????
да, классы используються...
причём ТОЛЬКО КЛАССЫ...
sharemem нужно куда добавлять? и нужно ли его добавлять? если я не ошибаюсь, то в каждый юнит, причём первым. так?
Digitman (2005-05-26 12:15:00) [43]
> Anatoly Podgoretsky © (26.05.05 12:12) [14]
> Да тут наверно еще и классы используются.
тут, судя по всему, - каша ... завареная на ОБС ..
Anatoly Podgoretsky (2005-05-26 12:12:00) [44]Да тут наверно еще и классы используются.
Digitman (2005-05-26 12:09:00) [45]
> procedure LibInfoProcedure(const Lib: TLibrary; const LibServer:
> TServer); stdcall;
> begin
> ...
> Application.Initialize; //это что еще за байда ?!
> end;
где sharemem ?
kblc (2005-05-26 11:56:00) [46]2 DigitMan
if Assigned(ProgressLabel) then
ProgressLabel.Caption:=format('"%s":'#13'сохранение переменных в реестре (%d)...',[prName,CONST_COUNT]);
но при вот этом проблема не исчезла
постю кода библиотеки:
function LibExecProcedure(const Param: string): string;
begin
Result:='';
if Param = 'START' then
begin
if not Assigned(fmMain) then
begin
Application.CreateForm(TfmMain, fmMain);
end;
fmMain.ShowModal;
end else
if Param = 'STOP' then
begin
Application.Terminate;
end;
end;
procedure LibDispProcedure(var MSG: TMessage);
begin
if (Msg.Msg>WM_USER) and (Msg.Msg<=MSG_COUNT) and Assigned(fmMain) then
fmMain.Dispatch(Msg);
end;
procedure LibInfoProcedure(const Lib: TLibrary; const LibServer: TServer); stdcall;
begin
SelfInfo := Lib;
Lib.LibName:= 'FIRST_FANTOM_LOADER';
Lib.LibCaption := 'Загрузчик "Фантом"';
Lib.LibClass := lcLoader;
Lib.ExecFunction := LibExecProcedure;
Lib.DispatchMsg := LibDispProcedure;
LibraryServer := LibServer;
Lib.LibFuncs.Add('START');
Lib.LibFuncs.Add('STOP');
Application.Initialize;
end;
exports
LibInfoProcedure name TLibInfoProcedureName;
begin
end.
kblc (2005-05-26 11:53:00) [47]2 Digitman:
у меня в библиотеке подключен Forms и вызываетьсяApplication.CreateForm()при окончании работы я вызываюApplication.Terminate;
+ При инициализации библиотеки вызываеться функция, которой передаёться TLibrary, я выделяю переменную, которой присваиваю этот класс.
Может ли быть так, что приApplication.Terminateуничтожаеться эта переменная? т.е. вызываеться её метод Destroy (Free)? или она вся затираетьсяс в памяти??? хотя данный объект класс TLibrary был создан в exe файле.
Может ли быть такое
Digitman (2005-05-26 11:51:00) [48]
> полностью убрал FreeLibrary и сразу после этого всё остальное
> заработало
что у тебя творится в dll ?
kblc (2005-05-26 11:41:00) [49]я полностью убрал FreeLibrary и сразу после этого всё остальное заработало(!!!!!!) fuck! из-за чего?
kblc (2005-05-26 11:40:00) [50]2 aplet:
проблема в том, что я ещё не вызвал метод destroy я просто сделал FreeLybrary(), и именно после этого происходит что-то нехорошее... :(
Digitman (2005-05-26 10:31:00) [51]
> kblc © (26.05.05 10:11) [5]
> ведь я его только начал уничтожать???
не-а... ты просто вызвал некий метод под названием Destroy ... а он - виртуальный ...
alpet (2005-05-26 10:16:00) [52]Была здесь где-то похожая проблема, все заработало когда из деструктора убрали inherited.
kblc (2005-05-26 10:11:00) [53]В каких случаях он может "уже не существовать"????
ведь я его только начал уничтожать???
и вот ещё: проблема..
if Assigned(ProgressLabel) then
ProgressLabel.Caption:=format('"%s":'#13'сохранение переменных в реестре (%d)...',[prName,CONST_COUNT]);
при выполении ф-ии format опять возникает access violation. Почему?
я так понимаю, что я где-то динамически забиваю память. Могу ли я её где-либо "затирать" ??? и как такое возможно?
у меня всё создаёться class'ами... т.е. "затирание" не должно происходить?
так же у меня при работу с библиотеками не передаёться ничего кроме class'ов ... и integer'ов..
что я делаю не так?
Digitman (2005-05-26 09:45:00) [54]
> почему?
ну наверно потому что объект уже не существует
kblc (2005-05-26 09:38:00) [55]понятно... но, дальше, при p.Destroy вызываеться получаеться так:
destructor TLibtary.Destroy;
begin
......
inherited; <<---
end;
после выполнения этой строчки возникает окно access violation и открываеться окно дебуггера, в котором кроме "?" ничего нет! почему?
Digitman (2005-05-26 09:02:00) [56]
> "Inaccesible Type"
это - сообщение дебагера, говорит оно о том, что просмотреть содержимое переменной p в дан.момент не представляется возможным по причине особенностей работы опимизатора, временно разместившего в дан.момент значение p в одном из РОН
kblc (2005-05-26 07:16:00) [57]забыл написать:
ExecFunction('STOP');выполняеться в самой библиотеке, хэндл которой LibHandle.
вот на что она ссылаеться:
function LibExecProcedure(const Param: string): string;
begin
Result:='';
if Param = 'START' then
begin
if not Assigned(fmMain) then
begin
fmMain:=tfmMain.Create(nil);
end;
fmMain.ShowModal;
end else
if Param = 'STOP' then
begin
LibraryServer:=nil;
SelfInfo:=nil;
fmMain:=nil;
end;
end;