![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Query.Open из DLL
andrey111 © (2005-01-17 18:16:00)Добрый вечер.
Подскажите как правильно передать запросу на форме,
находяшийся в DLL, параметры Database из вызывающей формы.
Проще говоря есть форма с Database. Она вызывает DLL в которых сидят Query, DBGridы и т.д. При Query.Open вылетает окно запроса
пароля на доступ к БД, хотя на вызывающей форме он есть.
Desdechado (2005-01-19 10:53:00) [1]2 Petr V. Abramov ©
Верно. А еще можно вместо DLL сделать BPL. По сути одно и тоже, а по способам доступа к ресурсам друг друга совсем иначе, проще: ограничение 2 из Desdechado © (18.01.05 11:15) [5] снимается.
Petr V. Abramov (2005-01-18 22:11:00) [2]> Я бы на твоём месте попробовал передать в DLL объект TDataBase
> и работать уже с ним. Тогда сохранится общий коннект.
Не сохранится. Нужен еще Session (при использовании BDE, при использовании других компонент - фиг еще знает что )
Гораздо проще скомпилировать exe и dll с runtime-пакетами. Тогда можно передвать что угодно куда угодно.
Соловьев (2005-01-18 16:13:00) [3]
...
if @Proc <>nil then Proc(Form1.Database. Handle) ;
...
В dll положить тоже TDatabase и при загрузке формы присваивать
...
DLLDatabase.Handle := AHandle;
...
andrey111 (2005-01-18 16:00:00) [4]Мастера Delphi где же Вы ????
2 Соловьев ©
я имел в виду что конечно LoginPromt = false,
но окно Database Login все равно появляется.
2 Desdechado ©
Как все таки к Query присвоить database.
andrey111 (2005-01-18 13:48:00) [5]->Соловьев © (18.01.05 13:40) [12]
LoginPromt = false
конечно
Соловьев (2005-01-18 13:40:00) [6]LoginPromt = false
andrey111 (2005-01-18 13:38:00) [7]В этом и вопрос
Query.Databasename:=aaa.Databasename;
приводит к ошибкам доступа к памяти.
если написать Query.Databasename:='cxvxc';
где cxvxc - aaa.Databasename то выскакивает
окно Database Login для ввода пароля доступа к БД,
и при вводе пароля всё ОК.
но Database в вызывающей форме окрыт - ????
и почему вылетает окно Database Login я не могу понять и
как его убрать ???
Desdechado (2005-01-18 13:02:00) [8]2 andrey111
ну, и где у тебя присваивание твоему квери переданной aaa: TDatabase?
И для форм лучше делать не Free, а Release (почитай в справке отличие):
with(TPRil1.Create(Application)) do
try
ShowModal();
finally
Release;
end;
Кроме того, блок try позволит избежать AV в случае, когда у тебя exception на форме вылезет.
mutabor (2005-01-18 12:39:00) [9]а сессию нельзя пеердавать?
andrey111 (2005-01-18 12:27:00) [10]--> Desdechado ©
Покажи в моих кусках проги
в Вызывающей проге
procedure TForm1.ButtonClick(Sender: TObject);
var
Proc: procedure (aaa : Tdatabase);
LIBHANDLE: Thandle;
begin
@Proc:=nil;
LIBHANDLE:=LoadLibrary('DLL1.DLL');
if NOT(LIBHANDLE=0) then begin
@Proc:=GetProcAddress(libhandle,'Pril1');
if @Proc <>nil then Proc(Form1.Database) ;
end;
FreeLibrary(libhandle);
end;
в DLL
library dll1;
uses
SysUtils,
Classes,
pril1 in 'pril1.pas' {FPril1};
//*******************
PROCEDURE Pril1 ( aaa : Tdatabase);STDCALL;
BEGIN
FPril1:=tFPril1.Create(FPril1);
FPril1.ShowModal;
FPril1.Free;
END;
EXPORTS Pril1;
begin
end.
В Pril1 сидит Query, DATASET, DBGRID И КНОПКА С КОДОМ
qUERY.cLOSE
qUERY.oPEN.
msguns (2005-01-18 11:47:00) [11]А откуда берется инфа о БД (параметрах коннекта) в Главной проге ? Если из ini или реестра, то почему бы и dll-ке не брать оттуда же ? Или dll-ка типа универсальная ?
Соловьев (2005-01-18 11:44:00) [12]2 Desdechado ©
Я не категорично... Просто был горький опыт с MS SQL.
Я у себя передаю ConnectionObject для ADOConnection. Работает отлично.
Desdechado (2005-01-18 11:15:00) [13]2 Соловьев ©
Не надо так категорично.
1. Ограничение на коннекты есть далеко не у всех и не для всех серверов.
2. Не всегда есть гарантия, что основной EXE и DLL откомпилированы в одной версии Delphi с использованием одних исходников. Если это не так, то при передаче указателя будут сплошные AV, ибо в DLL тоже хранится описание используемых классов, но своё. И оно не совпадает с тем, что в ЕХЕ. Следовательно, будет обращаться не по тем адресам. Поэтому для большей надежности я и говорил о передаче параметров подключения.
2 andrey111
в DLL пишем
function doSmth( App: HWND; db: TSQLConnection ): CARDINAL; stdcall;
begin
Application.Handle := App;
dbDll := db;
result := ProcessData();
end;
dbDll - это внутренняя переменная типа TSQLConnection
для БДЕ бери TDatabase
Ega23 (2005-01-18 11:02:00) [14]Если в ДЛЛ передавать параметры соединения, то это будет ещё один коннект. В общем случае это не есть гуд.
Я бы на твоём месте попробовал передать в DLL объект TDataBase и работать уже с ним. Тогда сохранится общий коннект.
andrey111 (2005-01-18 10:31:00) [15]В DLL могу присвоить QUERY имя Database как строку, но тогда
при Open выдается запрос пароля (IB), хотя DataBase открыта - глюк? при вводе пароля все работает.
При передачи указателя Database возникают ошибки доступа к памяти.
Если можно на примере покажите как сделать?
Соловьев (2005-01-17 19:33:00) [16]>правильнее, конечно, передать необходимые для подключения
>параметры (взятые из TDatabase), создать в DLL соединение и через
>него подключать квери
Не правильно. Потому как лицензионные сервера имеют ограничения на конекты - поэтому если один коннект занят главной формой, то еще один занимать для длл - непозволительная роскошь.
Desdechado (2005-01-17 19:31:00) [17]самый простой, но далеко не самый правильный - передать как параметр указатель на TDatabase, а на него в DLL цеплять все квери
правильнее, конечно, передать необходимые для подключения параметры (взятые из TDatabase), создать в DLL соединение и через него подключать квери - но здесь может стать против логика выполнения запросов (например, часть транзакции выполняется в DLL, чать в вызывающей форме), но это, имхо, вообще изврат
вызывающая форма :)) и ее поведение - хороший каламбур