Помогите нужна помощь!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.((( Что делать как установить связь для отображения данных? |
Никогда, нет не так - НИКОГДА не пытайтесь работать смешивая VCL в DLL и программе. У программы и DLL РАЗНЫЕ RTTI и, соответственно передавая указатель на tDataSource в DLL вы и получаете бред, так как tDataSource в программе совсем другой тип, чем в DLL. Если так надо вынести связь с базой в отдельный модуль - используйте пакеты. Это во-первых.
А во-вторых - подумайте что у Вас останется в DataSource после закрытия запроса и соединения с БД? |
AlexVol, у меня просто встал такой вопрос.Я пытаюсь написать программу но так что бы была наименьшая нагрузка на оперативную память и меньше было кода.Просто компоненты ADOConnection, ADOQuery у меня практически везде, где идет работа с БД.А это большая часть DLLок хотел просто их создавать один раз и подключать всех остальных к ним.А за совет про пакеты спасибо почитаю по пробую разобраться.
|
А смысл в отдельных DLL? Сделайте себе стандартный DataModule и подключайте его к своим проектам.
А использовать так как первоначально хотели все равно не получится: еще раз подумайте: что останется в возвращаемом DataSource после ЛИКВИДАЦИИ ADOQuery? Не говоря о том, что Вы еще и соединение с базой закрываете. Вы же не таскаете копии выборок между компонентами, а меняете ссылки на компоненты. |
Время: 11:30. |
Время: 11:30.
© OSzone.net 2001-