![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
InterBase
Donor © (2003-07-28 11:44:00)
Есть Dll и функция в оной, в нее я передаю
(i:integer;k:TIbDataBase;Hwnd:THandle):integer;stdcall;
также в библиотеку добавлена форма и DataModule!
Так вот вопрос- если не делать никаких запросов из таблиц
(DataModule.IBQ.SQL.ADD("select * from DDD"))или вообще не работать с Interbase, то все работает нормольно!, но как только я делаю запрос, то именно при закрытии программы,которая вызывает DLL вылетает ошибка "...access violation..."! В чем проблема подскажите пожалуста!? Заранее спасибо!
Donor (2003-07-29 10:13:00) [1]
Я передаю TIbDataBase в библиотеку для того чтобы подключиться к БД, а дальше работать с Interbase!
jack128 (2003-07-28 14:29:00) [2]
> Исходя из всего дело не в этом, т.к. k:TIbDataBase выступает
> в качестве ссылки на объект.
В общем ты неправ. Если где то в код есть проверка if k is TibDatabase, то она вернет false..
Но в этом коде нечего такого нету....
> Так вот вопрос- если не делать никаких запросов из таблиц
>
> (DataModule.IBQ.SQL.ADD("select * from DDD"))или вообще
> не работать с Interbase,
А где с базой работаешь, в DLL или в основной программе?
Вообще что ты делаешь с объектом ibdatabase в dll"ке?
Donor (2003-07-28 13:26:00) [3]
Посоветуйте что делать?
Donor (2003-07-28 12:45:00) [4]
И еще этот же код под Д5 работает без проблем!
Donor (2003-07-28 12:43:00) [5]ТЕКСТ ФУНКЦИИ
function Spr(InID,IBDB:Integer; hWnd:THandle):Integer; stdcall;
begin
InitID:=inID;
IBData:=IBDB;
Application.Handle:=hWnd;
try
FormDepartment:=TFormDepartment.Create(Application);
AddFormTV:=TAddFormTV.Create(Application);
if FormDepartment.ShowModal=mrOk then Result:=OutID else Result:=-1;
finally
AddFormTV.Free;
FormDepartment.Free;
end;
end;
exports
Spr;
begin
end.
ТЕКСТ ВЫЗОВА
type
DLLFunc=function(InID,IBDB:Integer; hWnd:THandle):Integer; stdcall;
EDLLLoadError = class(Exception);
var
mainForm: TmainForm;
implementation
{$R *.dfm}
procedure TmainForm.BtnOneClick(Sender: TObject);
var LibHandle:THandle;
ShowDLL:DLLFunc;
R:integer;
begin
LibHandle:=LoadLibrary("departments.dll");
try
if LibHandle=0 then
raise EDLLLoadError.Create("?????????? ????????? ??????????!");
@ShowDLL:=GetProcAddress(LibHandle,"Spr");
if not (@ShowDLL=nil) then
begin
R:=ShowDLL(0,integer(IBD),Application.Handle);
ShowMessage(IntToStr(r));
end
else
RaiseLastWin32Error;
( LibHandle)ТЕКСТ ФУНКЦИИ
function Spr(InID,IBDB:Integer; hWnd:THandle):Integer; stdcall;
begin
InitID:=inID;
IBData:=IBDB;
Application.Handle:=hWnd;
try
FormDepartment:=TFormDepartment.Create(Application);
AddFormTV:=TAddFormTV.Create(Application);
if FormDepartment.ShowModal=mrOk then Result:=OutID else Result:=-1;
finally
AddFormTV.Free;
FormDepartment.Free;
end;
end;
exports
Spr;
begin
end.
ТЕКСТ ВЫЗОВА
type
DLLFunc=function(InID,IBDB:Integer; hWnd:THandle):Integer; stdcall;
EDLLLoadError = class(Exception);
var
mainForm: TmainForm;
implementation
{$R *.dfm}
procedure TmainForm.BtnOneClick(Sender: TObject);
var LibHandle:THandle;
ShowDLL:DLLFunc;
R:integer;
begin
LibHandle:=LoadLibrary("departments.dll");
try
if LibHandle=0 then
raise EDLLLoadError.Create("?????????? ????????? ??????????!");
@ShowDLL:=GetProcAddress(LibHandle,"Spr");
if not (@ShowDLL=nil) then
begin
R:=ShowDLL(0,integer(IBD),Application.Handle);
ShowMessage(IntToStr(r));
end
else
RaiseLastWin32Error;
finally
FreeLibrary(LibHandle);
end;
end;
end.
Victor_Cr (2003-07-28 12:28:00) [6]
> jack128 © (28.07.03 12:15)
Исходя из всего дело не в этом, т.к. k:TIbDataBaseвыступает в качестве ссылки на объект.
> Donor © (28.07.03 11:44)
Приведи текст инициализации и освобождения ДЛЛ, а также ту самую пресловутую функцию.
jack128 (2003-07-28 12:15:00) [7]
В том что TIBDatabase в DLL"ке и TibDatabase в основной программе - фактически это два разных класса(хоть они и содержут абсолютно одинковый код).
Попробуй скомпилировать DLL и основную программу с Run time пакетами..