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

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

FreeLibrary [D7, Win95/98, WinXP]


Страницы:   1 2 3

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;


Страницы:   1 2 3

Наверх

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