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

Вниз

инструкция 0х0000000 обратилась по адресу 0х0000000   Найти похожие ветки 

 
max2057 ©   (2003-04-14 17:41) [0]

написал прогу:
основная программа читает конфиг и запускает поток, тот грузит DLL-ки и по завершении работы их выгружает.
потом перенес это в сервис и при останове вылетает сакраментальное "инструкция 0х0000000 обратилась по адресу 0х0000000 память не может быть "read"".
В чем прикол может быть?


 
Тётя Вася   (2003-04-14 20:03) [1]

Line #17


 
Digitman ©   (2003-04-15 08:33) [2]


> В чем прикол может быть?


"Прикол" в том, что нужно заняться трассировкой/отладкой сервисного приложения. Само по себе (без отладки) ни одно приложение, ни у кого и никогда не заработает как положено.


 
max2057 ©   (2003-04-15 09:38) [3]

Умные, да? Про отладку я и так знаю не надо мне философию разводить.
Я знаю что ошибка с этими адресами инструкции и памяти 0х0000000 - довольно специфическая и где-то я читал про нее а вспомниить не могу


 
Digitman ©   (2003-04-15 09:57) [4]


> ошибка с этими адресами инструкции и памяти 0х0000000 -
> довольно специфическая


что ж в этом "специфического" ? imho, нет ничего "специфического" !


> Про отладку я и так знаю не надо мне философию разводить


знаешь ? а что же вопрос задаешь тогда ??
а уж коль растерялся, будь так любезен - приводи код !


 
Reystlin   (2003-04-15 10:27) [5]

Это довольно интересная проблема, у меня было такое при выгрузке DLL из памяти при явной загрузке, при чем убирая выгрузку из памяти, ошибка пропала (знаю, что это не правильно). Но никто мне помочть не смог, у всех все нормально, код у меня со всеми эдентичный, пример с компакта ишедшего с книгой.

Ошибка, вроде, в освобождении памяти, которая уже свободна. Но я могу и ошибаться, я еще только учусь.


 
max2057 ©   (2003-04-15 13:36) [6]

2 Reystlin
Аналогично!

procedure TASMThread.FreeLibraries;
var
i : integer;
j : LongBool;
begin
log.Write(elDebug,["Unloading converters"]);
try
for i:=0 to CvrList.Count-1 do begin
try
j := FreeLibrary(HINST(PHANDLE(CvrList.Objects[i])^));
Dispose(PHANDLE(CvrList.Objects[i]));
if j=false then begin
log.Write(elDebug,["failed to unload "+(CvrList[i])]);
end
else begin
log.Write(elDebug,["successfully unloaded "+CvrList[i]]);
end;
except
;
end;
end;
CvrList.Clear;
except
log.Write(elError,["Error unloading converters"]);
end;
log.Write(elDebug,["Converters unloaded"]);
end;


function TASMThread.LoadConverters : boolean;
var
dllList : TStringList ;
i : integer;
proc : TFarProc;
dllHINST : THANDLE ;
p : PHANDLE;
r : pchar ;
j : integer;
begin
log.Write(elDebug,["Loading converters"]);
CvrList.Clear;
try
result := true;
dllList := TStringList.Create ;
FindFiles(DirForDll,"*.dll",dllList);
if dllList.Count>0 then begin
for i := 0 to dllList.Count-1 do begin
try
dllHINST := LoadLibrary(pchar(DirForDll+FNDelim+dllList[i]));
if dllHINST=0 then begin
log.Write(elError,["can""t load "+dllList[i]]);
continue;
end;
proc := GetProcAddress(dllHINST,"GetModuleName");
if proc=nil then begin
log.Write(elError,["procedure GetModuleName not found in "+dllList[i]]);
continue;
end;
r := TGetNameProc(proc);
if r<>nil then begin
new(p);
p^ := DllHINST;
j := CvrList.Add(r);
CvrList.Objects[j] := TObject(p);
Log.Write(elDebug,["loaded "+dllList[i]]);
end;
except
continue;
end;
end;
end
else result := false;
finally
dllList.Free;
end;
end;

Вот загрузка и выгрузка
вот код - где косяк?


 
Роман Василенко ©   (2003-04-15 14:01) [7]

Есть осчусчение, что ты передаёшь/получаешь из модуля переменную типа string, а uses sharemem не сделал.

Если интересно - по почте.


 
max2057 ©   (2003-04-15 14:14) [8]

Sharemem - первый включаемый модуль в Dll и в проекте,
из Dll получаю строку, но через pchar
а глюк выскакивает только в сервисе в оконном варианте его нет
причем выскакивает он при попытке выгрузки последней Dll - я сначала думал, что Dll глючит и убрал ее из каталога с Dll,но глюк опять выскочил при выгрузке Dll которая стала последней


 
Alex44   (2003-04-15 15:28) [9]

A zachem takie slozhnosti s New i Dispose?
Pochemu ne AddObject(..., Pointer(DllHInst)) ?


 
max2057 ©   (2003-04-15 15:37) [10]

про AddObject не знал но сомневаюсь что это что-то меняет


 
boa ©   (2003-04-16 07:26) [11]

>max2057
А почему вы решили что именно в этих процедурах "косяк"?
Допустим ваша процедура в DLL имеет вид:

function MyFunction(...): PChar
var
s: string;
begin
...
Result := PChar(s)
end;

а в основной программе идет присвоение результата функции переменной (как у вас в примере) Если "время жизни" s меньше "времени жизни" r (а выгружается библиотека до завеншения программы) то вот тут вы и получите ваш "косяк".



 
Anatoly Podgoretsky ©   (2003-04-16 07:59) [12]

Обычно так, только с небольшим отличеем.

function MyFunction(...): PChar
var
AnyPointer: string;
begin
AnyFunction(AnyPointer);
end;


 
viol-2   (2003-04-16 11:06) [13]

У тебя случайно в dll нет нити?
если есть и ты ее перед выгрузкой терминейтишь то все понятно.


 
Alex44   (2003-04-16 12:50) [14]


> max2057 © (15.04.03 15:37)
> про AddObject не знал но сомневаюсь что это что-то меняет


Delo ne v AddObject. Delo v tom, chto Integer i Pointer---odnogo razmera, tak chto, esli nuzhno hranit" odno Integer (ili Handle), to net smysla vydelyat" pod nego kusok pamyati i hranit" ssylku.


 
max2057 ©   (2003-04-21 13:23) [15]

Извините за долгое молчание
я даже переделывал так что dll"ки грузит первичный поток до запуска вторичного но глюк оставался


 
Digitman ©   (2003-04-21 14:33) [16]

IsMultiThread := True ??


 
max2057 ©   (2003-04-21 15:11) [17]

да


 
Digitman ©   (2003-04-21 17:41) [18]

а запись в лог поставить ?
на Process/Thread Attach/Detach ?



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

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

Наверх




Память: 0.51 MB
Время: 0.013 c
7-97898
Intell
2003-04-20 20:25
2003.06.30
Как создать ярлык для своего приложения?


1-97674
Serg!!™™
2003-06-17 14:20
2003.06.30
Form


6-97774
LOX
2003-04-23 20:23
2003.06.30
Edit1 и E-mail


3-97531
Viktor
2003-06-06 13:09
2003.06.30
TUpdateSQL : как удалить последнюю запись в датасете ?


14-97813
Sergey13
2003-06-11 08:52
2003.06.30
Вопрос к женатым и с детьми.