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 14:06:00) [21]

Вот сейчас проблема вот в этом:
суда приходит сообщение SM_TERMINATE

procedure TMainServer.InsideSendMsg(var Msg: TMessage);
var
 CanClose: boolean;
begin
 DispatchMsg(Msg);
 if Msg.Msg = SM_TERMINATE then
 begin
   CanClose:=true;
   if Assigned(CloseAction) then CloseAction(nil, CanClose);
 end;
end;


вот что вызывается на метод CloseAction:

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


А вот это выполняеться по таймеру:


procedure TfmMainServer.tim_SavingTimer(Sender: TObject);
begin
 tim_Saving.Enabled:=false;
 CanCloseFirst:=true;
 Close;
end;


когда я дебугю procedure TMainServer.InsideSendMsg(var Msg: TMessage)и когда курсор находиться на последнем end; после нажатия F8 вылетает debugger с "?" ... и надписью Thread #..  из-за чего? что-то я не понимаю...


Anatoly Podgoretsky   (2005-05-26 14:03:00) [22]

Слушай положил бы ты на эти ДЛЛ, не для Дельфи они, и что бы использовать их в Дельфи надо многое учитывать, никаких диначеских структур, никаких объектов, естественно при взаимном использовании. Для Дельфи придуман механизм BPL


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


> kblc ©   (26.05.05 13:52) [33]


ты знаком с трассировкой кода dll-проекта ?


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

каша какая-то ...

"Смешались в кучу кони, люди.." (с) ..

и сообщения тут, и AV, и Inaccessible, и Application .. и чего только нет в солянке) ...

ты уж сосредоточься на чем-то конкретном ...


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

Нашёл у себя проблемку...
при отсылке сообщения библиотеки... не хватало одной проверки.

но... я последовал вашим советам... теперь у меня получаеться вообще неописуемые прекрасы:

procedure TMainServer.InsideSendMsg(var Msg: TMessage);
var
 CanClose: boolean;
begin
 DispatchMsg(Msg);
 if Msg.Msg = SM_TERMINATE then
 begin
   if Assigned(CloseAction) then CloseAction(nil, CanClose);
 end;
end;

сюда приходит сообщение от dll-ки при уничтожении формы SM_TERMINATE ...
CloseAction = MyForm.CloseQuery
Он закрывает форму.. прекрасно выгружает библиотеку... но потом......

со стороны моей формы, создаёться таймер, который подождёт 2 сек. и сам закроет форму.

но проблема не в этом...

когда я дебугю procedure TMainServer.InsideSendMsg(var Msg: TMessage)и когда курсор находиться на последнем end;после нажатия F8 вылетает debugger с "?" ... и надписью Threan #..  из-за чего? что-то я не понимаю...


Digitman   (2005-05-26 13:31:00) [26]


> Добавил во все юниты (первым) ShareMem


НЕЛЬЗЯ этого делать !

ShareMem, если необходимо, следует добавлять первым элементом в uses проекта
(т.е. текста взк-файла), а не в uses модулей в его составе !


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

Добавил во все юниты (первым) ShareMem и
только что убрал при вызове TLibrary.Destroy функцию FreeLIbrary, теперь вообще всё заработало.. я НИЧЕГО НЕ ПОНИМАЮ!

Если оставить FreeLibrary то сразу после неё возникает ошибка
уже на строчке
Server[LOG_SERVER].ExecFunction('LOG '+format('"%s": выгрузка завершена.',[Name]));
причём, все параметры и сама ф-ия определены.


Eraser   (2005-05-26 13:28:00) [28]

kblc ©   (26.05.05 13:19) [28]

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

ЗЫ Ставь его в самом начале uses.


Digitman   (2005-05-26 13:28:00) [29]


> для чего нужен юнит ShareMem


единый менеджер памяти для всех потенциальных модулей делфи-приложения

один модуль запрашивает память, другой запрашивает ее освобождение - и все запросы автоматом направляются одному и тому же "диспетчеру", модулю ShareMem  ... ну это так. упрощенно, "на огурцах", ч.н.


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

Объясните для чего нужен юнит ShareMem?


Eraser   (2005-05-26 13:15:00) [31]

kblc ©   (26.05.05 13:11) [25] как мне правильно инициализировать и работать внутри библиотеки... ?

Да никак. Просто экспортируй из этой библиотеки хотя бы одну ф-ю, остальное компилятор сделает за тебя.


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


> я не хочу спорить


ты не спорь, ты просто ДУМАЙ ВСЛУХ ...


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

такой вопрос:
 как мне правильно инициализировать и работать внутри библиотеки... ?
 ведь мне нужно создать MDIFrom, а потом уже MDIChild's формы (они тоже буду грузитьсяс из библиотек)...

 Будьте добры - подскажите как мне это сделать.


Eraser   (2005-05-26 13:07:00) [34]

kblc ©   (26.05.05 09:38) [3]

понятно... но, дальше, при p.Destroy вызываеться получаеться так:

destructor TLibtary.Destroy;
begin
......
inherited;         <<---
end;


Сразу что бросилось в глаза, поменяй местами
......
и
inherited;


kblc   (2005-05-26 12:59:00) [35]

я не хочу спорить!
неужели вам так сложно показать мне КАК сделать правильно????
я уже запарился ...
что мне нужно сделать?


Игорь Шевченко   (2005-05-26 12:55:00) [36]


> application.terminate (проверено, что после вызова это фени
> библиотека сама выгружаеться)


Не выгружается.


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


> Application.Initialize - нафиг не нужен (просто эксперементировал),
>


ну где-то ж ты это видел ?) ... из ОБС, очевидно ..


> Application.CreateForm()  - для создания формы. почему я
> не сделал fmMain:=tfmMain.create ??? потому что(!!!!) потом
> буду использоваться mdi формы, которым нужно что бы было
> определено application.mainform


э-э-э, братец ... дело плохо ... ты, видимо, не осознаешь, что при тех или иных условиях объект Application хост-приложения и тот же объект библиотеки - не одно и то же .. т.е. совершенно разные объекты ..


> application.terminate (проверено, что после вызова это фени
> библиотека сама выгружаеться)


с какого перепугу-то ?! ты же ЯВНО выгружаешь быбл-ку в своем UpLoad ?!


kblc   (2005-05-26 12:45:00) [38]

ок:

Application.Initialize - нафиг не нужен (просто эксперементировал),

Application.CreateForm()  - для создания формы. почему я не сделал fmMain:=tfmMain.create ??? потому что(!!!!) потом буду использоваться mdi формы, которым нужно что бы было определено application.mainform.

application.terminate (проверено, что после вызова это фени библиотека сама выгружаеться)

что-нибудь ещё?


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


> личных соображений


угу .. давай про "личные" ..

те или иные обращения к объекту Application в теле dll-кода прокомментируй ?


kblc   (2005-05-26 12:37:00) [40]

2 DigitMan:
ты обвиняешь меня в неграмотности написания?
я пишу исходя из определённых требований и личных соображений одновременно.

Лучше бы дал какой-нибудь дельный совет.
что сделать конкретно?


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

Наверх

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