Доброго времени суток ...
Из главного модуля программы происходит динамическая загрузка 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 'имя базы'".
Выручайте, не могу найти где ошибка.... Спасибо.