![]() |
| ||
|
|
Новости |
Поиск |
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"
Почему так получаеться?
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;
когда я дебугю procedureTMainServer.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:
ты обвиняешь меня в неграмотности написания?
я пишу исходя из определённых требований и личных соображений одновременно.
Лучше бы дал какой-нибудь дельный совет.
что сделать конкретно?