Форум: "Базы";
Текущий архив: 2005.02.20;
Скачать: [xml.tar.bz2];
ВнизQuery.Open из DLL Найти похожие ветки
← →
andrey111 (2005-01-17 18:16) [0]Добрый вечер.
Подскажите как правильно передать запросу на форме,
находяшийся в DLL, параметры Database из вызывающей формы.
Проще говоря есть форма с Database. Она вызывает DLL в которых сидят Query, DBGridы и т.д. При Query.Open вылетает окно запроса
пароля на доступ к БД, хотя на вызывающей форме он есть.
← →
Desdechado © (2005-01-17 19:31) [1]самый простой, но далеко не самый правильный - передать как параметр указатель на TDatabase, а на него в DLL цеплять все квери
правильнее, конечно, передать необходимые для подключения параметры (взятые из TDatabase), создать в DLL соединение и через него подключать квери - но здесь может стать против логика выполнения запросов (например, часть транзакции выполняется в DLL, чать в вызывающей форме), но это, имхо, вообще изврат
вызывающая форма :)) и ее поведение - хороший каламбур
← →
Соловьев © (2005-01-17 19:33) [2]>правильнее, конечно, передать необходимые для подключения
>параметры (взятые из TDatabase), создать в DLL соединение и через
>него подключать квери
Не правильно. Потому как лицензионные сервера имеют ограничения на конекты - поэтому если один коннект занят главной формой, то еще один занимать для длл - непозволительная роскошь.
← →
andrey111 (2005-01-18 10:31) [3]В DLL могу присвоить QUERY имя Database как строку, но тогда
при Open выдается запрос пароля (IB), хотя DataBase открыта - глюк? при вводе пароля все работает.
При передачи указателя Database возникают ошибки доступа к памяти.
Если можно на примере покажите как сделать?
← →
Ega23 © (2005-01-18 11:02) [4]Если в ДЛЛ передавать параметры соединения, то это будет ещё один коннект. В общем случае это не есть гуд.
Я бы на твоём месте попробовал передать в DLL объект TDataBase и работать уже с ним. Тогда сохранится общий коннект.
← →
Desdechado © (2005-01-18 11:15) [5]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
← →
Соловьев © (2005-01-18 11:44) [6]2 Desdechado ©
Я не категорично... Просто был горький опыт с MS SQL.
Я у себя передаю ConnectionObject для ADOConnection. Работает отлично.
← →
msguns © (2005-01-18 11:47) [7]А откуда берется инфа о БД (параметрах коннекта) в Главной проге ? Если из ini или реестра, то почему бы и dll-ке не брать оттуда же ? Или dll-ка типа универсальная ?
← →
andrey111 (2005-01-18 12:27) [8]--> 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.
← →
mutabor (2005-01-18 12:39) [9]а сессию нельзя пеердавать?
← →
Desdechado © (2005-01-18 13:02) [10]2 andrey111
ну, и где у тебя присваивание твоему квери переданной aaa: TDatabase?
И для форм лучше делать не Free, а Release (почитай в справке отличие):with(TPRil1.Create(Application)) do
try
ShowModal();
finally
Release;
end;
Кроме того, блок try позволит избежать AV в случае, когда у тебя exception на форме вылезет.
← →
andrey111 (2005-01-18 13:38) [11]В этом и вопрос
Query.Databasename:=aaa.Databasename;
приводит к ошибкам доступа к памяти.
если написать Query.Databasename:="cxvxc";
где cxvxc - aaa.Databasename то выскакивает
окно Database Login для ввода пароля доступа к БД,
и при вводе пароля всё ОК.
но Database в вызывающей форме окрыт - ????
и почему вылетает окно Database Login я не могу понять и
как его убрать ???
← →
Соловьев © (2005-01-18 13:40) [12]LoginPromt = false
← →
andrey111 (2005-01-18 13:48) [13]->Соловьев © (18.01.05 13:40) [12]
LoginPromt = false
конечно
← →
andrey111 (2005-01-18 16:00) [14]Мастера Delphi где же Вы ????
2 Соловьев ©
я имел в виду что конечно LoginPromt = false,
но окно Database Login все равно появляется.
2 Desdechado ©
Как все таки к Query присвоить database.
← →
Соловьев © (2005-01-18 16:13) [15]
...
if @Proc <>nil then Proc(Form1.Database.Handle) ;
...
В dll положить тоже TDatabase и при загрузке формы присваивать
...
DLLDatabase.Handle := AHandle;
...
← →
Petr V. Abramov © (2005-01-18 22:11) [16]> Я бы на твоём месте попробовал передать в DLL объект TDataBase
> и работать уже с ним. Тогда сохранится общий коннект.
Не сохранится. Нужен еще Session (при использовании BDE, при использовании других компонент - фиг еще знает что )
Гораздо проще скомпилировать exe и dll с runtime-пакетами. Тогда можно передвать что угодно куда угодно.
← →
Desdechado © (2005-01-19 10:53) [17]2 Petr V. Abramov ©
Верно. А еще можно вместо DLL сделать BPL. По сути одно и тоже, а по способам доступа к ресурсам друг друга совсем иначе, проще: ограничение 2 из Desdechado © (18.01.05 11:15) [5] снимается.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.02.20;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.028 c