![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как расшарить ADOConnection из exe в dll?
WondeRu © (2005-11-08 14:31:00)Здарвствуйте!
Подскажите, пожалуйста, каким образом можно использовать в dll ADOConnection, созданный в exe приложении?
Заранее спасибо!
ANB (2005-11-08 16:33:00) [1]
> WondeRu © (08.11.05 16:24) [7]
Млин, про разные версии ты не писал. Тогда и правда, нельзя.
WondeRu (2005-11-08 16:24:00) [2]ANB © (08.11.05 16:14) [6]
Application вроде народ передает.
передает, но не просто так... передается лишь хэндл:
Application.Handle
Ссылку на объект нельзя передавать, потому что dll и exe могут быть скомпилированы в разных версиях Delphi (т.е. они возможно будут иметь различное объявление одного и того же класса).
В моем случае dll может быть скомпилирована и на C++ (код правда надо будет чуть подправить ;) ).
Глобальные переменные - это по ситуации (я их почти не использую).
ЗЫ. Работает, но не знаю правильно ли (имеется в виду RefCount у _Connection и еще возможные траблы) :(
ANB (2005-11-08 16:14:00) [3]
> WondeRu © (08.11.05 15:48) [5]
Больше меня знаешь, а просишь совета.
По коду : думаю, что ты захочешь работать с этим коннектом внутри самой DLL из других функций, посему переменную для коннекта я бы сделал глобальной. Иначе смысл в этой DLL ?
Кстати - работает ?
ЗЫ. Для общего развития - а почему нельзя передавать ссылку на объект ? Application вроде народ передает.
WondeRu (2005-11-08 15:48:00) [4]вот чего-то наваял, жду ваших замечаний:
exe:
procedure DoSelect(AIConnection: _Connection);stdcall;external 'project2.dll' name 'DoSelect';
procedure TForm1.Button1Click(Sender: TObject);
begin
DoSelect(ADOConnection1.ConnectionObject);
end;
dll:
procedure DoSelect(AIConnection: _Connection);
var
ADOQuery: TADOQuery;
ADOConnection: TADOConnection;
begin
ADOConnection := TADOConnection.Create(nil);
ADOQuery := TADOQuery.Create(nil);
try
ADOConnection.ConnectionObject := AIConnection;
ADOQuery.Connection := ADOConnection;
ADOQuery.SQL.Text := 'select * from results';
ADOQuery.Open;
if not ADOQuery.Eof then
begin
MessageBox(0, PChar(ADOQuery.Fields[0].AsString),'',mb_ok);
end;
ADOQuery.Close;
finally
ADOQuery.Free;
ADOConnection.Free;
end;
end;
WondeRu (2005-11-08 15:31:00) [5]ANB © (08.11.05 15:29) [3]
Нельзя передавать внутрь другого модуля ссылку объект, только интерфейс!
ANB (2005-11-08 15:29:00) [6]
> Если адрес объекта TADOConnection, то это не ко мне :)
А к кому ? Пример делать надо - а некогда. Граблей соберешь по любому. Хотя может и подскажет кто с примером.
WondeRu (2005-11-08 15:24:00) [7]ANB © (08.11.05 15:22) [1]
а подробнее?
Если адрес объекта TADOConnection, то это не ко мне :)
ANB (2005-11-08 15:22:00) [8]Подключить в DLL нужные модули и передать его адрес.