Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
4-1104329917
Tatianka
2004-12-29 17:18
2005.02.20
Как получить код возврата потока, вызываемого из другого прилож?


14-1107180412
heh
2005-01-31 17:06
2005.02.20
научите танцевать


8-1099495145
Змей
2004-11-03 18:19
2005.02.20
MediaPlayer


6-1101214635
R.O.O.T
2004-11-23 15:57
2005.02.20
Ресурсы типа С$,D$,ADMIN$


1-1107384287
Green_Templar
2005-02-03 01:44
2005.02.20
добавить в справку





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