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

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

Интерфейс программы храниться в DLL [D7, WinXP]


Николай1 ©   (2005-08-31 12:28:00) 

Народ может кто подскажет почему при вызове фомы в приложении
всё Ok, но при закрытии программы вадаётся ошибка, типа что Dll
досихпор инициализированна хотя на закрытие MDI окна стоит процедура UnloadLibFrmAssort();
код ниже.

unit Sp_Assortimenta;

interface

uses
.................
type
 TForm_Assort = class(TForm)
.................
 private
   procedure UnloadLibFrmAssort();
 public

 end;

function  InitLibFrmAssort(App,Scr: Integer;Sowing:Boolean;Connect:string): Boolean; register; exports InitLibFrmAssort;

var
 Form_Assort: TForm_Assort;
 DLLApp: TApplication;
 DLLScr: TScreen;
 ConnectionString:String;
implementation

uses Add_Edit_Assort;

{$R *.dfm}

function InitLibFrmAssort(App,Scr: Integer;Sowing:Boolean;Connect:string): Boolean;
begin
if not Sowing then
 begin
  ConnectionString:=Connect;
  ShowMessage(ConnectionString);
  DLLScr := Screen;
  Screen := TScreen(Scr);
  DLLApp:=Application;
  ShowMessage(IntToStr(Integer(DLLApp)));
  Application:=TApplication(App);
  ShowMessage(IntToStr(Integer(Application)));
  Form_Assort:=TForm_Assort.Create(Application);
  Form_Assort.Show;
  Result:=True;
 end
else
 begin
  OpenIcon(Form_Assort.Handle);
  Result:=True;
 end;
end;

Procedure TForm_Assort.UnloadLibFrmAssort();
begin
Form_Assort.Free;
Screen := DLLScr;
Application:=DLLApp;
ShowMessage(IntToStr(Integer(Application)));
end;
.....................
.....................
.....................

procedure TForm_Assort.FormCloseQuery(Sender: TObject;
 var CanClose: Boolean);
begin
if ADOTable1.State in [dsEdit, dsInsert] then
 if MessageDlg('Возможна потеря редактируемых данных.',mtWarning,mbOKCancel,1)=mrCancel then
  CanClose := False
 else
   ADOTable1.Active:=False
else
 ADOTable1.Active:=False;
end;

procedure TForm_Assort.FormClose(Sender: TObject;
 var Action: TCloseAction);
begin
UnloadLibFrmAssort();
end;

end.


Reindeer Moss Eater   (2005-08-31 15:04:00) [1]

Коля, ты там уже договорись со своей программой, какая именно  у тебя там ошибка.
А потом спросишь, как её исправить.

Ok?


Николай1   (2005-08-31 14:58:00) [2]

Точнее при закрытии программы выдаётся ошибка:
raised too many consecutive exeptions: .................
если функции не вызывать то выход из программы нормальный.


Reindeer Moss Eater   (2005-08-31 14:08:00) [3]

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

При статическом импорте (а он у тебя такой) об этом не надо вообще беспокоиться.


Brenagwynn   (2005-08-31 13:25:00) [4]

Да, кстати. А в uses ты не забыл ShareMem включить на первом месте?


IceBeerg   (2005-08-31 13:10:00) [5]

А FreeLibrary не помогает?


Николай1   (2005-08-31 13:03:00) [6]

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


Reindeer Moss Eater   (2005-08-31 13:00:00) [7]

У тебя статический импорт функции библиотеки.
Значит либу грузит windows.
И пока твой процесссуществует, библиотека будет загружена.
Делать проверку на то, что при закрытии какого-то там окна библиотека выгружена - бессмысленно.


Николай1   (2005-08-31 12:56:00) [8]

Инициализацию делаю так
unit Unit2;
interface
uses
Forms;

const   DllFrmAssort = 'Sp_AssortDll.dll';

function  InitLibFrmAssort(App,Scr: Integer;Sowing:Boolean;Connect:string): Boolean; external DllFrmAssort;

и просто вызываю эту функцию.

может я чтото не так деля подскажите если кто знает.


Reindeer Moss Eater   (2005-08-31 12:53:00) [9]

И что из этого?
Библиотека должна после этого кода испугаться и выгрузиться сама по себе?


Николай1   (2005-08-31 12:51:00) [10]

На закрытие окна роц делает вот этот код

Form_Assort.Free; - убиваем окно
Screen := DLLScr; - Возвращаем TScreen глоб перемен прилож
Application:=DLLApp; - Возвращаем TApplication глоб перемен прилож


Reindeer Moss Eater   (2005-08-31 12:45:00) [11]

Ну и как связано убийство окна с выгрузкой DLL?


Николай1   (2005-08-31 12:37:00) [12]

Нет при закрытии главного окна приложения выдаётся ошибка, что Dll висит в памяти. Хотя его окна уже нет убили, закрыли тобиш.


Reindeer Moss Eater   (2005-08-31 12:32:00) [13]

хотя на закрытие MDI окна стоит процедура UnloadLibFrmAssort();

Стоит и стоять будет. И что из этого?
Она что-то делает с загруженной библиотекой?


Наверх

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