Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2007.04.08;
Скачать: [xml.tar.bz2];

Вниз

Передача указателя на подключение к базе в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.046 c
2-1173951345
Quelle
2007-03-15 12:35
2007.04.08
Из шестнадцатиричного формата в текст


11-1154152692
Stals
2006-07-29 09:58
2007.04.08
Звуковое сопровождение


9-1146876433
TDummyCube
2006-05-06 04:47
2007.04.08
Как найти локальную матрицу, если есть две глобальные?


1-1171213592
kilop
2007-02-11 20:06
2007.04.08
Как программно создать обработчик события OnClick


2-1173896890
Malik
2007-03-14 21:28
2007.04.08
Проблема с Delphi





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский