![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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,..
хотя бы статьи,.