Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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 в объявлении - спасибо!!! что обратили внимание!!! как раз в этом то и было дело... исправил - все заработало!!!
.... а вот еще такой вопрос:  а как правильно передавать коннект в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.045 c
15-1147268292
49 Cent
2006-05-10 17:38
2006.06.04
Как отключить beep


2-1147680301
manevil
2006-05-15 12:05
2006.06.04
ShellExecute


15-1146854934
ArtemESC
2006-05-05 22:48
2006.06.04
Глаза...


2-1147332027
KVN
2006-05-11 11:20
2006.06.04
Вопрос по DBGrid


4-1142103030
Handle
2006-03-11 21:50
2006.06.04
Процессы,окна





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский