Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.04;
Скачать: CL | DM;

Вниз

ADO и DLL, как передать коннект к БД?   Найти похожие ветки 

 
MakNik   (2006-04-12 10:32) [0]

Приложение через один общий коннект подключается к MSSQL. Из приложения динамически подключается DLL с формой.
Нужно чтобы форма из библиотеки могла подключаться к БД используя тот-же коннект, что и у приложения. Подскажите, плз., как передать в DLL коннект к базе?


 
stone ©   (2006-04-12 10:39) [1]

Передать объект ADOConnection в виде параметра


 
MakNik   (2006-04-12 10:56) [2]

код DLL:
Procedure ShowModal(VConnection:TADOConnection); stdcall;
var
 About: TAbout;
begin
 About := TAbout.Create(nil);
 About.Connection:=VConnection;
 About.ShowModal;
 About.Free;
end;


вызываю процедуру из DLL:
procedure TMainForm.N21Click(Sender: TObject);
var
     ShowAbout: Procedure(VConnection:TADOConnection);

     LibHandle: THandle;
     IpLibFileName:Pchar;
begin
 Try
    @ShowAbout := nil;
    IpLibFileName:=Pchar(ExtractFilePath(Application.ExeName)+"Library\AboutForm.dll");
    LibHandle := LoadLibrary(IpLibFileName);
    if LibHandle >= 32 then begin
      @ShowAbout := GetProcAddress(LibHandle,"ShowModal");
      if @ShowAbout <> nil then
        ShowAbout(dm.ADOConnection);
    end;
 finally
    FreeLibrary(LibHandle);
 End;
end;


Подскажите, пожалуйста,  что я делаю не так? ...


 
MakNik   (2006-04-12 11:00) [3]

unit AboutUnit;
...
 private
   FConnection:TADOConnection;
 public
   property Connection: TADOConnection read FConnection Write FConnection;
...
 end;
...
procedure TAbout.FormShow(Sender: TObject{;Var Connection:TADOConnection});
begin
 inherited;
   ADOQuery.Active:=false;
   ADOQuery.Connection:=Connection;
   ADOQuery.SQL.Clear;
   ADOQuery.SQL.Add("...");
   ADOQuery.Active:=True;
end;


 
MakNik   (2006-04-12 11:02) [4]

ошибку выдает при попытке ADOQuery.Connection:=Connection;
Подскажите, пожалуйста, как правильно реализовать передачу коннекта в DLL?


 
stone ©   (2006-04-12 11:17) [5]


> About.Connection:=VConnection;

About.Connection.Assign(VConnection);


 
MakNik   (2006-04-12 11:34) [6]

... никак не получается...
теперь выдает ошибку:
Acces violation at address 04513432 in module "AboutForm.dll". Read of address 00000000


 
stone ©   (2006-04-12 11:44) [7]


> stone ©   (12.04.06 11:17) [5]
>
> > About.Connection:=VConnection;
>
> About.Connection.Assign(VConnection);


Сорри, так не проедет, это я не доглядел...
тебе надо присваивать FConnection
например при создании формы


 
sniknik ©   (2006-04-12 11:52) [8]

> теперь выдает ошибку:
> Acces violation at address 04513432 in module "AboutForm.dll". Read of address 00000000
потому что обьект не создан, если так делать то

About.Connection:= TADOConnection.Create(...);
About.Connection.Assign(VConnection);


 
MakNik   (2006-04-12 12:16) [9]

... теперь другая ошибка:
Access violation ...


 
sniknik ©   (2006-04-12 12:29) [10]

> ... теперь другая ошибка:
а это у тебя другой обьект неопределен.


 
Romkin ©   (2006-04-12 12:38) [11]

Может, все-таки проще передавать интерфейс коннекта?!
А именно просто значение ConnectionObject


 
MakNik   (2006-04-12 13:50) [12]


> Может, все-таки проще передавать интерфейс коннекта?!
> А именно просто значение ConnectionObject

... примерчик приведите, пожалуйста...


 
WondeRu ©   (2006-04-13 08:31) [13]

типа такого:
var
cnDriver: TADOConnection;
........
SaveData(cnDriver.ConnectionObject);
........
procedure SaveData(AConnection: OleVariant): WordBool;
var
 RS: _Recordset;
begin
 RS := CoRecordSet.Create;

 RS.Open("insert into table1 (aaa) values ("wedwed")", AConnection, adOpenDynamic, adLockReadOnly, adCmdText)
end;



 
Ega23 ©   (2006-04-13 11:12) [14]

код DLL:
Procedure ShowModal(VConnection:TADOConnection); stdcall;

procedure TMainForm.N21Click(Sender: TObject);
var
    ShowAbout: Procedure(VConnection:TADOConnection);


А зачем stdcall? И если он нужен, то где он тогда в объявлении ShowAbout?


 
MakNik   (2006-04-13 18:00) [15]


> А зачем stdcall? И если он нужен, то где он тогда в объявлении
> ShowAbout?

... думаю что stdcall нужен, по крайней мере так описано в хелпе, ... правда до конца этот вопрос еще не понимаю т.к. только осваиваю этот вид программирования....  буду благодарен за внятное разъяснение...
... а вот по поводу отсутствия stdcall в объявлении - спасибо!!! что обратили внимание!!! как раз в этом то и было дело... исправил - все заработало!!!
.... а вот еще такой вопрос:  а как правильно передавать коннект в DLL Procedure(VConnection:TADOConnection); или Procedure(var VConnection:TADOConnection);???


 
Ega23 ©   (2006-04-13 18:15) [16]


> ... думаю что stdcall нужен, по крайней мере так описано
> в хелпе


Если так описано в хелпе, это ещё не означает, что он там действительно нужен.
Читай про "Соглашения о вызовах".


> DLL Procedure(VConnection:TADOConnection); или Procedure(var
> VConnection:TADOConnection);???


Читай про разницу между "параметр по-значению" и "параметр по-ссылке", а также читай про то, что такое экземпляр класса в Delphi.



Страницы: 1 вся ветка

Текущий архив: 2006.06.04;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.111 c
4-1141718189
Handle
2006-03-07 10:56
2006.06.04
Иконка в ListView


2-1147848747
dest81
2006-05-17 10:52
2006.06.04
Событие от клавиатуры


15-1147153694
Мефисто
2006-05-09 09:48
2006.06.04
Искусство программирования на Ассемблере. 3-е изд. Как оно?


15-1147345875
Slava812
2006-05-11 15:11
2006.06.04
Цвета в Delphi


2-1147699621
Ironman83
2006-05-15 17:27
2006.06.04
Выборки через TIBDataset