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

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

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 пакетами..


Наверх

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