Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-26448
novill
2003-05-29 09:25
2003.06.09
Странная ситуация при showmodal


6-26634
nomad
2003-04-08 10:55
2003.06.09
savedialog


14-26779
SPeller
2003-05-23 11:59
2003.06.09
Электроника


6-26647
Equillibrium
2003-04-08 04:23
2003.06.09
Kak v delphi BANNER sdelat


14-26734
Malder
2003-05-19 22:02
2003.06.09
Вред от ламп





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский