Greshnick
02-10-2011, 12:42
Имееться dll в которой динамически создаются компоненты для связи с БД(access .mdb) и приложение в которой находиться DBGRIG и DATASOURCE.
Вот что получилось после 4 дней мучений и изучения материала:
Код DLL:
library Project1;
uses
SysUtils,
Classes,Forms,
ADODB, DB;
procedure Connect(Handle: THandle; DS: TDataSource);export;stdcall;
var
ADOConnect: TADOConnection;
ADOQuery: TADOQuery;
Begin
Application.Handle:=Handle;
ADOConnect:=TADOConnection.Create(nil);
ADOQuery:=TADOQuery.Create(nil);
ADOConnect.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\user\Desktop\Систематизатор 2011\Удалить\Baze.mdb;Persist Security Info=False';
ADOConnect.LoginPrompt:=False;
ADOQuery.Connection:=ADOConnect;
ADOQuery.SQL.Text:='Select* from документы';
DS.DataSet:=ADOQuery;
ADOConnect.Open;
ADOQuery.Open;
ADOQuery.Close;
ADOConnect.Close;
end;
{$R *.res}
exports Connect index 1;
begin
end.
Код приложения:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, StdCtrls, DB, ActiveX, ComObj, ADODB;
type
TForm1 = class(TForm)
Button1: TButton;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
ADOConnection1: TADOConnection;
ADOTable1: TADOTable;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
dll : THandle;
Run : procedure (Handle: THandle; DS: TDataSource); StdCall;
begin
try
Dll:=LoadLibrary('dll\Project1.dll');
if DLL=0 then
begin
exit;
end
else
begin
@Run:=GetProcAddress(DLL,'Connect');
if (@Run<>nil) then
Begin
Run(dll,Form1.DataSource1);
end
else
end;
except
end;
end;
end.
Но когда нажимаю связаться с БД то выскакивает ошибка: Invalid Pointer Operation.((( Что делать как установить связь для отображения данных?
Вот что получилось после 4 дней мучений и изучения материала:
Код DLL:
library Project1;
uses
SysUtils,
Classes,Forms,
ADODB, DB;
procedure Connect(Handle: THandle; DS: TDataSource);export;stdcall;
var
ADOConnect: TADOConnection;
ADOQuery: TADOQuery;
Begin
Application.Handle:=Handle;
ADOConnect:=TADOConnection.Create(nil);
ADOQuery:=TADOQuery.Create(nil);
ADOConnect.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\user\Desktop\Систематизатор 2011\Удалить\Baze.mdb;Persist Security Info=False';
ADOConnect.LoginPrompt:=False;
ADOQuery.Connection:=ADOConnect;
ADOQuery.SQL.Text:='Select* from документы';
DS.DataSet:=ADOQuery;
ADOConnect.Open;
ADOQuery.Open;
ADOQuery.Close;
ADOConnect.Close;
end;
{$R *.res}
exports Connect index 1;
begin
end.
Код приложения:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, StdCtrls, DB, ActiveX, ComObj, ADODB;
type
TForm1 = class(TForm)
Button1: TButton;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
ADOConnection1: TADOConnection;
ADOTable1: TADOTable;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
dll : THandle;
Run : procedure (Handle: THandle; DS: TDataSource); StdCall;
begin
try
Dll:=LoadLibrary('dll\Project1.dll');
if DLL=0 then
begin
exit;
end
else
begin
@Run:=GetProcAddress(DLL,'Connect');
if (@Run<>nil) then
Begin
Run(dll,Form1.DataSource1);
end
else
end;
except
end;
end;
end.
Но когда нажимаю связаться с БД то выскакивает ошибка: Invalid Pointer Operation.((( Что делать как установить связь для отображения данных?