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"
Почему так получаеться?


kblc   (2005-05-26 15:12:00) [1]

к сожалению я не могу сейчас продолжать... продолжим завтра ...
всем бооольшое спасибо
правда


Digitman   (2005-05-26 15:03:00) [2]


> функция ExecProcedure в библиотеке не успевает завершить
> свою работу


т.е. она реализует асинхронную логику ?... какого ж ... ты сразу об этом не упомянул ?)

ЧТО является признаком фактического (успешного или неуспешного) завершения работы алгоритма, инициированного к выполнению вызовом ExecProcedure() ?


kblc   (2005-05-26 14:55:00) [3]

я нашёл в чём ошибка...

я постоянно вызываю метод DispatchMsg не используя SendMessage().. это естественно, ведь у меня классы не имеют хэндла...

тут я сам наступил на грабли... у меня вызывался метод MainServer.Save который выгружал все dll, но(!!!) изучая я пришёл к выводу, что функция ExecProcedure в библиотеке не успевает завершить свою работу (т.к. клсвенно вызвала метод MainSercver.Save, который уже выгрузил её саму).

Как же мне тогда сделать так, что бы этого не повторялось?

Я засунул метод Save в таймер ... который срабатывает после 2 секунд после обработки сообщения метода DispatchMsg. Тепрь всё работает. Никаких ошибок.
Но я считаю что это неправильно.

Как же мне сделать "правильно"?


Digitman   (2005-05-26 14:45:00) [4]


> kblc ©   (26.05.05 14:44) [53]


как минимум - при файловом вводе/выводе ..


kblc   (2005-05-26 14:44:00) [5]

когда появляеться вот такая ошибка? EInOutError with message "I/O Error 103"


Digitman   (2005-05-26 14:44:00) [6]

например, привести сюда декларацию и реализацию метода DispatchMsg..


kblc   (2005-05-26 14:41:00) [7]

2 Digitman: проверил все декларации.
Всё полностью совпадает.
Что ещё я могу сделать?


Digitman   (2005-05-26 14:32:00) [8]

это значит что декларация п/п в вызывающем коде должна в точности соответствовать декларации той же п/п в вызываемом коде


kblc   (2005-05-26 14:30:00) [9]

Digitman, что значит "проверить соглашения в вызове"?


Digitman   (2005-05-26 14:24:00) [10]

для начала нужно проверить соглашения о вызове


kblc   (2005-05-26 14:23:00) [11]

2 Digitman: да, именно! я про это самое окно!...

тогда вопрос звучит так: как определить откуда она появляеться и что нужно делать что бы её не было???


Digitman   (2005-05-26 14:17:00) [12]


> если это именено то окно дебуггера


что такое "окно дебуггера" ?

в этом окне - куча фреймов : фрейм секции кода, фрейм секции данных, фрейм секции стека, фрейм регистров CPU ...

если эти самые "одни знаки "?" ты видишь во фрейме секции кода, то это может означать: нарушение соглашений о вызове, загаживание тобой стека в теле вызванной п/п, дохрена чего еще может означать ..


kblc   (2005-05-26 14:14:00) [13]

раньше там просто было CanClose - заменить не успел
DigitMan, отгадай откуда этот брался CanClose ???
наверное из объекта класса!


Digitman   (2005-05-26 14:12:00) [14]


> if not Self.CanCloseFirst then


в данномконтексте выделенное жирным выдает дилетанта)
это тоже не ОБС ?


kblc   (2005-05-26 14:12:00) [15]

блин... я и на F7 жал! ... да ёпрст... а что за асм код - да-не знаю.... если это именено то окно дебуггера где одни знаки "?" ???


kblc   (2005-05-26 14:11:00) [16]

2 DigitMan:

запостить весь код??? 58 КБ текста (всё вместе)???


Digitman   (2005-05-26 14:10:00) [17]


> kblc ©   (26.05.05 14:08) [38]


а шут его знает, КАК ты "их" отлаживаешь)

вообще-то еще клавиша F7 есть ... и asm-код ...


Digitman   (2005-05-26 14:09:00) [18]


> из-за чего?


да из-за чего угодно.
шматок кода он и есть шматок кода.
в отрыве от остального кода рассуждать о причинах не имеет смысла.


kblc   (2005-05-26 14:09:00) [19]

извиняюсь за ляп:

procedure TfmMainServer.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=Self.CanCloseFirst;
if not Self.CanClose Firstthen
begin
  if not Visible then Visible:=true;
  MainServer.Save;
  tim_Saving.Interval:=CNST_TIMER_SAVE_INTERVAL; //2*1000
  tim_Saving.Enabled:=true;
end;
end;


kblc   (2005-05-26 14:08:00) [20]

2 DigitMan:
Конечно знаком! а как по-твоему я их отлаживаю???


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

Наверх

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