Динамически подключаемая Dll и Msconnection

Тема в разделе "Delphi - Базы данных", создана пользователем Boatswain, 22 мар 2010.

  1. Boatswain

    Boatswain Member

    Регистрация:
    13 ноя 2008
    Сообщения:
    5
    Симпатии:
    0
    Доброго времени суток.
    Есть программа на Delphi6 для работы с MSSQL7 с помощью SDAC.
    Необходимо подключить к ней форму с Query и DBGrid, но чтобы форма была в dll.
    С написанием dll особо не сталкивался.

    Делаю так:
    Создаю dll проект

    uses
    SysUtils,
    Classes,
    Forms, DB, DBAccess, MSAccess,
    Myform in 'Myform.pas' {Form1};

    {$R *.res}

    procedure RunMyForm(Param1:Integer; MyConnection: TMSConnection); cdecl;
    begin
    Form1 := TForm1.Create(Param1, MyConnection, Application);
    Form1.ShowModal;
    Form1.Free;
    end;

    exports RunMyForm;

    begin
    end;

    и форму.На ней DBGrid1, MSQuery1, MSDataSource1, ну и кнопка.

    type
    TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    MSQuery1: TMSQuery;
    MSDataSource1: TMSDataSource;
    DBGrid1: TDBGrid;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    private
    { Private declarations }
    public
    { Public declarations }
    Param1:integer;
    MyConnection: TMSConnection;
    Constructor Create(AParam1:integer; AMyConnection: TMSConnection; AOwner : TComponent);reintroduce;
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    Constructor TForm1.Create(AParam1:integer; AMyConnection: TMSConnection; AOwner : TComponent);
    begin
    inherited Create(AOwner);
    MyConnection:= AMyConnection;
    Param1:=AParam1;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    MSQuery1.Connection:=MyConnection;
    MSQuery1.Open;
    end;

    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    if MSQuery1.Active then MSQuery1.Close;
    end;

    end.

    Для вызова пробывал 2 варианта
    1.Статический.
    type
    TForm1 = class(TForm)
    Button1: TButton;
    MSConnection1: TMSConnection;
    MSQuery1: TMSQuery;
    MSDataSource1: TMSDataSource;
    DBGrid1: TDBGrid;
    procedure Button1Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}
    procedure RunMyForm(Param1:integer; MyConnection:TMSConnection); cdecl; external 'Mydll.DLL';

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    RunMyForm(1,MSConnection1);
    end;

    end.

    2.Динамический.
    type
    TForm1 = class(TForm)
    Button1: TButton;
    MSConnection1: TMSConnection;
    procedure Button1Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    type
    TDLLProc = procedure(AParam1:Integer; AMyConnection:TMSConnection);
    var
    MyHandle : THandle;
    MyProc : TDLLProc;
    HouseId:Integer;
    begin
    MyHandle:=LoadLibrary('D:\Work\MyDLL\MyDLL.dll');
    if MyHandle>=32 then { if <=32 - error ! }
    begin
    @MyProc:=GetProcAddress(MyHandle,'RunMyForm');
    if @MyProc<>nil
    then
    begin
    MyProc(1, Form1.MSConnection1);
    end
    else
    ShowMessage('Функция не найдена!');
    try
    FreeLibrary(MyHandle);
    except
    end;
    end
    else
    ShowMessage('Библиотека не найдена!');
    end;

    Так вот при нажатии на Button1 в первом случае все работает, а во втором

    Access violation at address 0116F24D in module 'MyDLL.dll'. Read of address 8BD88B97.

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

    Заранее благодарен за ответ.
     
Загрузка...

Поделиться этой страницей