Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Помогите нужна помощь!ADO и DLL! (http://forum.oszone.net/showthread.php?t=216965)

Greshnick 02-10-2011 12:42 1764095

Помогите нужна помощь!ADO и DLL!
 
Имееться 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.((( Что делать как установить связь для отображения данных?

AlexVol 03-10-2011 12:36 1764863

Никогда, нет не так - НИКОГДА не пытайтесь работать смешивая VCL в DLL и программе. У программы и DLL РАЗНЫЕ RTTI и, соответственно передавая указатель на tDataSource в DLL вы и получаете бред, так как tDataSource в программе совсем другой тип, чем в DLL. Если так надо вынести связь с базой в отдельный модуль - используйте пакеты. Это во-первых.
А во-вторых - подумайте что у Вас останется в DataSource после закрытия запроса и соединения с БД?

Greshnick 04-10-2011 10:32 1765482

AlexVol, у меня просто встал такой вопрос.Я пытаюсь написать программу но так что бы была наименьшая нагрузка на оперативную память и меньше было кода.Просто компоненты ADOConnection, ADOQuery у меня практически везде, где идет работа с БД.А это большая часть DLLок хотел просто их создавать один раз и подключать всех остальных к ним.А за совет про пакеты спасибо почитаю по пробую разобраться.

AlexVol 04-10-2011 16:14 1765704

А смысл в отдельных DLL? Сделайте себе стандартный DataModule и подключайте его к своим проектам.
А использовать так как первоначально хотели все равно не получится: еще раз подумайте: что останется в возвращаемом DataSource после ЛИКВИДАЦИИ ADOQuery? Не говоря о том, что Вы еще и соединение с базой закрываете. Вы же не таскаете копии выборок между компонентами, а меняете ссылки на компоненты.


Время: 11:30.

Время: 11:30.
© OSzone.net 2001-