Текущий архив: 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.49 MB
Время: 0.037 c