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