Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.09;
Скачать: CL | DM;

Вниз

Access violation ... in module rtl60.bpl   Найти похожие ветки 

 
Dimedrol ©   (2003-05-28 15:12) [0]

Работаю с созданным мною модулем. Загрузается,
работает хорошо,
а при выгрузке получаю сабж.
Прочем, по всем признакам он все таки выгружается, т.к.
я его могу снова загрузить и он ни на что не ругается,
как при случае, когда я специально ремаркировал
процедуру выгрузки.

Не подскажет ли кто, что я там не особождаю... ?


 
Dimedrol ©   (2003-05-28 15:13) [1]

Модуль - имеется в виду - пакет BPL


 
Думкин ©   (2003-05-28 15:16) [2]

Ошибка в 17-й строке.
покажи Дестрой.
И все создаваемые объекты.


 
Dimedrol ©   (2003-05-28 15:22) [3]

Вот сам модуль

unit main;
interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, CommonInterfaces;

type
TMSSQL1 = class(TForm,IMSSQL)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }

protected

// ITERFACE !!!
function TouchMSSQL(const s:string):boolean;

end;

var
MSSQL1: TMSSQL1;

implementation

{$R *.dfm}

function TMSSQL1.TouchMSSQL(const s:string):boolean;
begin
MessageBox(0,"I have been Touched", "MSSQL:", MB_OK+MB_ICONINFORMATION+MB_SYSTEMMODAL);
end;

procedure TMSSQL1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;

initialization
RegisterClass(TMSSQL1);
finalization
UnRegisterClass(TMSSQL1);
end.


Вот выгрузка модуля :


procedure TModuleManager.UnLoadModule(const packagefilename:string);
var
i,j: Integer;
M: TMemoryBasicInformation;
// Module: HModule;
begin
if LoadedLiveCount<=0 then exit;

for j:=0 to LoadedLiveCount-1 do
if (UpperCase(Modules[j].Modulename)=UpperCase(packagefilename))
and Modules[j].Loaded

then

begin

try
{ Make sure there aren"t any instances of any of the classes from Module instantiated, if so then free them. (This assumes that the classes are owned by the application) }
for i := Application.ComponentCount - 1 downto 0 do
begin
VirtualQuery(
GetClass(Application.Components[i].ClassName),
M, SizeOf(M));
if (Modules[j].MHandler = 0) or
(HMODULE(M.AllocationBase) = Modules[j].MHandler) then
Application.Components[i].Free;
end;
UnRegisterModuleClasses(Modules[j].MHandler);
UnLoadPackage(Modules[j].MHandler);
except
on E:Exception do
begin
MessageBox(0, pchar(E.Message), "Unloading package", MB_APPLMODAL+MB_ICONERROR+MB_OK);
end;
end;

Modules[j].Loaded:=false;
Modules[j].Active:=false;

break;
end;
end;


 
Dimedrol ©   (2003-05-28 15:23) [4]

Причем эта выгрузка отлично работает с другим модулем...


 
Юрий Зотов ©   (2003-05-28 15:44) [5]

Все компоненты модуля имеют Owner"ом только Application, или хотя бы у одного из них Owner"ом может быть не только Application?

Если второе, то все правильно - после выгрузки модуля ссылки на его компоненты окажутся битыми и это приведет к ошибкам.


 
Юрий Зотов ©   (2003-05-28 16:12) [6]

Сорри, ссылки на его классы, конечно.


 
Dimedrol ©   (2003-05-28 16:51) [7]

2 Юрий Зотов
Ну то есть я не правильно его выгружаю...
А что нужно делать (перед выгрузкой) ?


 
Юрий Зотов ©   (2003-05-28 17:33) [8]

После выгрузки пакета в программе уже не существует кода классов, которые этот пакет содержал, а если в пакете были еще и простые процедуры и/или глобальные переменные, то и они, естественно, тоже перестают существовать. Значит, нужно обеспечить, чтобы после выгрузки пакетов к его коду и к его переменным уже не было обращений. Как минимум, нужно уничтожить все компоненты, классы которых этот пакет содержал. Но ВСЕ, а не только те, владельцем которых является Application (как у Вас сейчас).

Можно сделать, как у Вас, только использовать рекурсию (начав ее с Application) - но ведь рекурсия не охватит компоненты без владельца. Кроме того, пакет ведь может содержать и некомпонентские классы.

Думаю, лучше попытаться переосмыслить задачу и начать с вопроса - для чего это надо? В чем цель и смысл?



Страницы: 1 вся ветка

Текущий архив: 2003.06.09;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.025 c
14-26685
Nick-From
2003-05-25 14:52
2003.06.09
при завершении работы в Win 98


1-26593
AbrosimovA
2003-05-23 09:04
2003.06.09
Как надежно закрыть связь с Excel-документом


14-26718
_san_
2003-05-22 09:29
2003.06.09
Как написать резидента


14-26672
k-man
2003-05-24 09:54
2003.06.09
Glut 3.7


8-26614
Арм
2003-02-26 02:37
2003.06.09
Трабла с OpenGL