Форум: "Базы";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];
Вниз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 в объявлении - спасибо!!! что обратили внимание!!! как раз в этом то и было дело... исправил - все заработало!!!
.... а вот еще такой вопрос: а как правильно передавать коннект в DLLProcedure(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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.041 c