Форум: "Основная";
Текущий архив: 2003.06.09;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c