![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ADO и DLL, как передать коннект к БД? [D5, MSSQL]
MakNik © (2006-04-12 10:32:00)Приложение через один общий коннект подключается к MSSQL. Из приложения динамически подключается DLL с формой.
Нужно чтобы форма из библиотеки могла подключаться к БД используя тот-же коннект, что и у приложения. Подскажите, плз., как передать в DLL коннект к базе?
Ega23 (2006-04-13 18:15:00) [1]
> ... думаю что stdcall нужен, по крайней мере так описано
> в хелпе
Если так описано в хелпе, это ещё не означает, что он там действительно нужен.
Читай про "Соглашения о вызовах".
> DLL Procedure(VConnection:TADOConnection); или Procedure(var
> VConnection:TADOConnection);???
Читай про разницу между "параметр по-значению" и "параметр по-ссылке", а также читай про то, что такое экземпляр класса в Delphi.
MakNik (2006-04-13 18:00:00) [2]
> А зачем stdcall? И если он нужен, то где он тогда в объявлении
> ShowAbout?
... думаю что stdcall нужен, по крайней мере так описано в хелпе, ... правда до конца этот вопрос еще не понимаю т.к. только осваиваю этот вид программирования.... буду благодарен за внятное разъяснение...
... а вот по поводу отсутствия stdcall в объявлении - спасибо!!! что обратили внимание!!! как раз в этом то и было дело... исправил - все заработало!!!
.... а вот еще такой вопрос: а как правильно передавать коннект в DLLProcedure(VConnection:TADOConnection);илиProcedure(var VConnection:TADOConnection);???
Ega23 (2006-04-13 11:12:00) [3]
код DLL:
Procedure ShowModal(VConnection:TADOConnection); stdcall;
procedure TMainForm.N21Click(Sender: TObject);
var
ShowAbout: Procedure(VConnection:TADOConnection);
А зачем stdcall? И если он нужен, то где он тогда в объявлении ShowAbout?
WondeRu (2006-04-13 08:31:00) [4]типа такого:
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;
MakNik (2006-04-12 13:50:00) [5]
> Может, все-таки проще передавать интерфейс коннекта?!
> А именно просто значение ConnectionObject
... примерчик приведите, пожалуйста...
Romkin (2006-04-12 12:38:00) [6]Может, все-таки проще передавать интерфейс коннекта?!
А именно просто значение ConnectionObject
sniknik (2006-04-12 12:29:00) [7]> ... теперь другая ошибка:
а это у тебя другой обьект неопределен.
MakNik (2006-04-12 12:16:00) [8]... теперь другая ошибка:
Access violation ...
sniknik (2006-04-12 11:52:00) [9]> теперь выдает ошибку:
> Acces violation at address 04513432 in module "AboutForm.dll". Read of address 00000000
потому что обьект не создан, если так делать то
About.Connection:= TADOConnection.Create(...);
About.Connection.Assign(VConnection);
stone (2006-04-12 11:44:00) [10]
> stone © (12.04.06 11:17) [5]
>
> > About.Connection:=VConnection;
>
> About.Connection.Assign(VConnection);
Сорри, так не проедет, это я не доглядел...
тебе надо присваивать FConnection
например при создании формы
MakNik (2006-04-12 11:34:00) [11]... никак не получается...
теперь выдает ошибку:
Acces violation at address 04513432 in module "AboutForm.dll". Read of address 00000000
stone (2006-04-12 11:17:00) [12]
> About.Connection:=VConnection;
About.Connection.Assign(VConnection);
MakNik (2006-04-12 11:02:00) [13]ошибку выдает при попытке ADOQuery.Connection:=Connection;
Подскажите, пожалуйста, как правильно реализовать передачу коннекта в DLL?
MakNik (2006-04-12 11:00:00) [14]
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 10:56:00) [15]код 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;
Подскажите, пожалуйста, что я делаю не так? ...
stone (2006-04-12 10:39:00) [16]Передать объект ADOConnection в виде параметра