Форум: "Основная";
Текущий архив: 2003.09.15;
Скачать: [xml.tar.bz2];
ВнизОшибка при выгрузке DLL. Найти похожие ветки
← →
evg (2003-09-02 09:00) [0]Уважаемые господа! Вопрос такого рода: имеется основная программа и DLL к ней. В DLL имеется класс, реализующий некоторый интерфейс. В секции initialization создается экземпляр объекта, в секции finalization он уничтожается. DLL экспортирует функцию, возвращающую интерфейс объекта. Основная программа явно загружает DLL, получает с помощью этой функции интерфейс и вызывает его методы. Все.
Все работает. Но почему-то возникает ошибка при уничтожении объекта в DLL. Отслеживал в CPU Window - сбоит функция _FreeMem. Если не вызывать экспортируемую функцию, ошибок не возникает.
Примерный текст программы:
library foo;
uses</bb> Unit1;
...
function QueryInterface: IInterface; stdcall;
begin
Result:=IMyIntf(Obj);
end;
exports QueryInterface;
begin
end;
-------------------------
unit Unit1;
type TObj = class(TInterfacedObject, IMyIntf)
....
end;
var Obj: TObj;
initialixation
Obj:=TObj.Create;
finalization
Obj.Free;
end;
------------------------
в программе
type TProc = function: IInterface; stdcall;
var h: THandle;
Proc: TProc;
h:=LoadLibrary("Foo.dll");
Proc:=GetProcAddress(h, "QueryInterface");
intf:=IMyIntf(Proc);
<вызов методов IMyIntf>
FreeLibrary(h);
← →
evg (2003-09-02 09:58) [1]Решение нашел сам, так что отвечу сам себе. Дело в том, что TInterfacedObject уничтожает сам себя при достижении счетчика ссылок на него (FRefCount) нуля. Поэтому явное уничтожение объекта не требуется.
← →
Skier (2003-09-02 11:05) [2]
> Решение нашел сам, так что отвечу сам себе. Дело в том,
> что TInterfacedObject уничтожает сам себя при достижении
> счетчика ссылок на него (FRefCount) нуля
С этим не поспоришь. :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.09.15;
Скачать: [xml.tar.bz2];
Память: 0.44 MB
Время: 0.012 c