Показать сообщение отдельно
  #1  
Старый 31.10.2013, 00:12
govorun govorun вне форума
Новичок
 
Регистрация: 30.10.2013
Сообщения: 60
Версия Delphi: delphi 7
Репутация: 10
По умолчанию Ошибка при выгрузке DLL

Доброго времени суток ...
Из главного модуля программы происходит динамическая загрузка DLL.
В DLL вносятся данные, в том числе и с помощью OpenDialog, которые потом сохраняются в базу Interbase. После сохранения данных в базе предусмотрена выгрузка DLL.

Код программы:
Код:
unit Unit2;

interface

uses
  Windows, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, DBGrids, StdCtrls, Grids, DBCtrls, DB, Mask;

type
TShowFormins=procedure(handle: Thandle); stdcall;
....

procedure TForm2.N4Click(Sender: TObject);
var
    dllins:thandle;
    ShowFormins:TShowFormins;

begin
    dllins:=LoadLibrary('ins.dll');
    @ShowFormins:=GetProcAddress(dllins, 'ShowFormins');
    ShowFormins(handle);
    freelibrary(dllins);

end;

Код DLL

Код:
unit insUnit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DBCtrls, Mask, DB, IBCustomDataSet, IBDatabase,
  IBTable, Grids, DBGrids;

type
  TForm1 = class(TForm)
  ......

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  procedure ShowFormins(handle: Thandle); export; stdcall;

implementation

{$R *.dfm}

procedure ShowFormins(handle: Thandle);
begin
    application.handle:=handle;
    form1:=tform1.create(application);
    form1.ShowModal;
    form1.Free;
 
end;

procedure TForm1.FormShow(Sender: TObject);
begin
    form1.IBTable1.Insert;
    form1.Button1.SetFocus;
    form1.dbmemo1.Clear;
    form1.DBEdit1.Clear;
    form1.DBEdit2.Clear;
    form1.DBEdit3.Clear;
    form1.DBEdit4.Clear;
    form1.DBEdit5.Clear;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
    with OpenDialog1, dbMemo1 do
    if Execute then
    Lines.LoadFromFile(FileName);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
      if IBTable1.Modified then
    DataSource1.DataSet.FieldByName('t_data').AsString:=formatdatetime('dd.mm.yyyy',now());
    IBTable1.Post;
    form1.dbmemo1.Clear;
    form1.DBEdit1.Clear;
    form1.DBEdit2.Clear;
    form1.DBEdit3.Clear;
    form1.DBEdit4.Clear;
    form1.DBEdit5.Clear;
      Form1.Close;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
    form1.IBTable1.Cancel;
    form1.Close;
end;

end.
Беда в следующем: если не использовать OpenDialog (с его помощью загружаеися файл в dbmemo и потом в поле BLOB базы данных) то все работает красиво и DLL выгружается из памяти (естественно без загрузки файла в базу).
При использовании OpenDialog DLL не выгружается и при повторной загрузке (без выхода из программы) выдает ошибку "I/O error for file 'имя базы'".
Выручайте, не могу найти где ошибка.... Спасибо.
Ответить с цитированием