Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как расшарить 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 нужные модули и передать его адрес.


Наверх

Титульная страница Поиск, карта сайта Написать письмо