Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.08;
Скачать: CL | DM;

Вниз

Передача указателя на подключение к базе в DLL   Найти похожие ветки 

 
alexey_mas ©   (2007-01-15 12:51) [0]

Прошу помочь с таким вопросом:
1)есть приложение в котором используется компонент ZConnection библиотеки ZEOS для подключения к базе данных Postgres.
2)Имеется DLL , которая вызывается из основного приложения. DLL выполняет некие запросы к базе данных. Используется компонент ZQuery.

Каким образом можно из основной формы передать указатель на подключение к базе данных (т.е. подключение ZConnection) в DLL чтобы ZQuery мог подключиться к базе?

Заранее спасибо.


 
Ega23 ©   (2007-01-15 12:58) [1]

Так и передать.
Только и Application, и DLL должны знать про ZConnection.


 
alexey_mas ©   (2007-01-15 13:09) [2]

Только и Application, и DLL должны знать про ZConnection.
Каким образом? создать свой ZConnection в DLL?

Хотелось бы примерчик какой нибудь :)


 
Ega23 ©   (2007-01-15 13:17) [3]

Зачем создать? Объяви, а потом присвой; это же указатель...


 
Sergey Masloff   (2007-01-16 06:41) [4]

Скорее всего столько глюков словишь...
Читай документацию. Официально способ передачи соединения через хендл из всего с чем я раболтал поддерживают только DOA. Видимо, особых проблем не будет с ADO. С остальным....


 
Ega23 ©   (2007-01-16 09:04) [5]


> С остальным....


А что с остальным? TDataBase, вроде как, тоже передаётся нормально. Хотя давно это было, может я и не прав...


 
alexey_mas ©   (2007-01-16 11:39) [6]

прошу направить по правильному пути :)
делаю в exe-ке


procedure TForm2.Button3Click(Sender: TObject);
var
Database_con: Pointer;
GetSimpleText3:function(_addr:pointer): integer; stdcall;
LibHandle: THandle;
begin
Database_con:=@PasswordDlg.ZConnection1;
 @GetSimpleText3 := nil;
 LibHandle := LoadLibrary("shema.dll");
 if LibHandle >= 32 then begin
 @GetSimpleText3:=GetProcAddress(LibHandle,"GetSimpleText3");
 if @GetSimpleText3 <> nil then
 GetSimpleText3(Database_con);
 end;
 FreeLibrary(LibHandle);
end;


т.е. передаю в длл в качестве параметра указатель на адрес ZConnection1

в DLL


function GetSimpleText3(_addr:pointer): integer; stdcall;
var
       Form : TForm1;
   
begin
       Form := TForm1.Create(Application);
       @Form.ZQuery1.Connection:=_addr;      - тут ругается при компиляции  Pascal Error] shema.dpr(32): E2036 Variable required
       Form1.ZQuery1.Active:=true;
       Result := Form.ShowModal;
       Form.Free;
       Result := 1;
end;


Правильно ли я делаю?  Как скомпилировать в длл ?


 
Ega23 ©   (2007-01-16 12:00) [7]


> Правильно ли я делаю?  Как скомпилировать в длл ?
>


Конечно неправильно.
И это, кстати, к вопросу о передачи объектов в DLL.


 
alexey_mas ©   (2007-01-17 10:40) [8]

Пробую передать объект
в exe пишу


procedure TForm2.Button3Click(Sender: TObject);
var
GetSimpleText3:function(my_conn:TZConnection): integer; stdcall;
LibHandle: THandle;
begin
 @GetSimpleText3 := nil;
 LibHandle := LoadLibrary("shema.dll");
 if LibHandle >= 32 then begin
 @GetSimpleText3:=GetProcAddress(LibHandle,"GetSimpleText3");
 if @GetSimpleText3 <> nil then
 GetSimpleText3(PasswordDlg.ZConnection1);
 end;
 FreeLibrary(LibHandle);
end;


В dll пишу

function GetSimpleText3(my_conn:TZConnection): integer; stdcall;
var
       Form : TForm1;
begin
       Form := TForm1.Create(Application);
       Form.ZQuery1.Connection:=my_conn;
       Form1.ZQuery1.Active:=true;
       Result := Form.ShowModal;


компилируется но вылетает access violation вот тута Form.ZQuery1.Connection:=my_conn;

Что не так?


 
Сергей М. ©   (2007-01-17 10:52) [9]

Собери оба проекта с установленной опцией Build With Run-Time Packages.
Удивись.


 
ANB ©   (2007-01-17 11:17) [10]


> Собери оба проекта с установленной опцией Build With Run-
> Time Packages.

Абсолютно верно.
В противном случае (без галки) будут глюки.

Объяснение процесса можно посмотреть здесь www.softwarer.ru.

PS. Кистате, раз уж DLL будет вызываться из делфовой программы, лучше и ее в BPL переделать.


 
alexey_mas ©   (2007-01-17 11:29) [11]

а на что влияет эта опция ? разницы не заметил, но проблему обнаружил

заработало

проблема была в этом  Form1.ZQuery1.Active:=true;

вынес это в обработчик кнопки после запуска  Form.ShowModal; и все пошло.


 
Сергей М. ©   (2007-01-17 11:42) [12]


> на что влияет эта опция ?


На построение результирующего кода - либо он использует ран-тайм-пакеты либо не использует.


> разницы не заметил


Разница есть и немалая.


> проблема была в этом  Form1.ZQuery1.Active:=true;


А эта "проблема"

> вылетает access violation вот тута Form.ZQuery1.Connection:=my_conn;


сама собой рассосалась ?


 
alexey_mas ©   (2007-01-17 12:06) [13]

А эта "проблема"

> вылетает access violation вот тута Form.ZQuery1.Connection:=my_conn;

сама собой рассосалась ? -тут я не заметил , извиняюсь,
на самом деле вот здесь
Form1.ZQuery1.Active:=true;
вылетал access violation  

В рез-те получил dll весом в 1,6 метра :( с одной формой на которой ZQuery,
   DataSource,Button,DBGrid.

Вынос формы в dll затевал для
1) уменьшения размера exe-ка путем выноса модальных форм в dll
2) упрощения поддержки этих форм путем изменения только dll

После этого вижу что общий размер программы(exe+dll) вырос в 2 раза и проще в exe-ке делать новые формы :(


 
Сергей М. ©   (2007-01-17 12:25) [14]


> alexey_mas ©   (17.01.07 12:06) [13]


> dll весом в 1,6 метра


> уменьшения размера exe-ка


Для сильно озабоченных этими (и не только этими) "проблемами" как раз и существует опция сборки модуля с рантайм-пакетами


 
alex_*** ©   (2007-01-17 12:47) [15]


> уменьшения размера exe-ка путем выноса модальных форм в
> dll

ты по модему обновления отсылаешь? :)
Form1.ZQuery1 это контрол на форме или public поле в классе?


> упрощения поддержки этих форм путем изменения только dll

Для упрощения поддержки гораздо полезнее грамотную иерархию форм разработать и не обращаться извне к модальным формам напрямую типа Form1.Edit1.Text := .... res := Form1.ShowModal();... и т.д.


 
alexey_mas ©   (2007-01-17 13:19) [16]


> Form1.ZQuery1 это контрол на форме или public поле в классе?

контрол


> Для упрощения поддержки гораздо полезнее грамотную иерархию
> форм разработать и не обращаться извне к модальным формам
> напрямую типа Form1.Edit1.Text := .... res := Form1.ShowModal();
> ... и т.д.

А как по другому ?

есть пример программы чтобы посмотреть можна было?


 
alex_*** ©   (2007-01-17 14:20) [17]


> > Form1.ZQuery1 это контрол на форме или public поле в классе?
>
>
> контрол
>

ну это ты зря. Не есть хорошо контролу присваивать другой контрол, который не принадлежит этой форме. Сделай поле и сам настраивай коннект для контролов.


> А как по другому ?
>
> есть пример программы чтобы посмотреть можна было?
>


да чего там смотреть. мысль типа этой.
в модуле с формой объявляем ф-цию:

function UPD_details(pid: integer; pname: String; pval: Real): boolean;
begin
  result := false;
  with TUPD_Form.Create(Application) do
  try
     edText.Text := pname;
     ID := pid;
     edVal.Text := FloatToStr(pval);
     result := ShowModal() == mrOk;
  finally
     Free();
  end;
end;

и вызываем её отовсюду вместо работы с TUPD_Form напрямую.
не тащим наверх особенности реализации update"a. По кр. мере я так всегда стараюсь делать.
+ еще можно сделать базовые формы для диалогов и других форм.



Страницы: 1 вся ветка

Текущий архив: 2007.04.08;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.048 c
4-1164204654
Creative
2006-11-22 17:10
2007.04.08
скорость отклика на WM_KEYDOWN


15-1173543352
Desdechado
2007-03-10 19:15
2007.04.08
Чай и наше здоровье


3-1168595092
AMS
2007-01-12 12:44
2007.04.08
Сообщение об ошибке в fastreport3.0


15-1173796015
eXPell
2007-03-13 17:26
2007.04.08
Исходящие...


4-1164017360
001
2006-11-20 13:09
2007.04.08
Подскажите пограмму для мониторинга сообщений чужой программы