Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ADO & DLL [D5, MSSQL]


Miau ©   (2003-08-23 14:42:00) 

Мастера, может ли кто-нибудь объяснить как обойти такое: не могу вызвать из DLL функцию, использующую ADOConnection и ADOQuery ?

Из dll вызывается функция, которая создаёт форму, на которой лежат ado-компоненты. На момент создания формы получается ошибка.

Если убрать ado-компоненты, то ошибки нет.

Или если компоненты оставить, а форму создать из обычного модуля (не dll), то тоже ошибки нет.

Я пришел к выводу, что ADO и dll не могут сосуществовать :(
Как это обойти ?


Opuhshii   (2003-08-25 18:49:00) [1]

2АлексейК (25.08.03 05:07) [3]
?

да, стоит написать например так,
with TForm1.Create(nil) do
try
ShowModal;
finally
Free;
end;

а Owner?.., по желанию.. ))

>передача Handle приложения
кто?


Miau   (2003-08-25 16:03:00) [2]

Спасибо!
Оно заработало !!


АлексейК   (2003-08-25 05:07:00) [3]

пишем, в нашей библиотеке что-то похожее на...
procedure CreateMyForm;
begin
with TForm1.Create(nil) do begin
ShowModal;
Free;
end;
end;

Интересно а почему owner=nil, а не Application, и где передача Handle приложения?


DrPass   (2003-08-24 12:52:00) [4]

А еще один нюансик, о котором история умалчивает:
uses ShareMem в dll и exe нужно писать не только, когда параметрами передаются ansi-строки, но и когда dll работает с классами VCL (просто потому, что эти строки там тоже активно используются).
На всякий случай напомню, модуль Sharemem должен быть на первом местев разделе uses


Opuhshii   (2003-08-23 18:23:00) [5]

хм,.. а к чему форма?,..
ну да бог с ней, ))
"Я пришел к выводу, что ADO и dll не могут сосуществовать :("
ошибочно,..
" получается ошибка"
а какая?,.. TTelepat не реализован ещё,..
скорее всего по причине отсутсвия инициализации апартмента в потоке вызывающего msado,..

пишем, в нашей библиотеке что-то похожее на...
procedure CreateMyForm;
begin
with TForm1.Create(nil) do begin
ShowModal;
Free;
end;
end;


соответственно,. где-то внутри формы открываем/закрываем подключение/рекордсет,..

procedure TMyAppForm.Button1Click(Sender: TObject);
var
MyLib:THandle;
MyProc:TProcedure;
begin
MyLib:=LoadLibrary(МояБиблиотека_ИмяЕё);
try
MyProc:=GetProcAddress(MyLib,"CreateMyForm");
if not Assigned(MyProc) then
raise Exception.Create("Can""t find CreateMyForm");
MyProc;
finally
FreeLibrary(MyLib);
end;
end;


читаем Platform SDK относительно CoInitialize,...
пример..

procedure TMyAppForm.FormCreate(Sender: TObject);
begin
CoInitialize(nil);
end;

procedure TMyAppForm.FormDestroy(Sender: TObject);
begin
CoUninitialize;
end;

Запускаем,.
начинаем читать внимательно/приобретаем книжки о COM/MSDN,..
хотя бы статьи,.


Наверх

Титульная страница Поиск, карта сайта Написать письмо