![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
инструкция 0х0000000 обратилась по адресу 0х0000000 [D5, Win2k]
max2057 © (2003-04-14 17:41:00)написал прогу:
основная программа читает конфиг и запускает поток, тот грузит DLL-ки и по завершении работы их выгружает.
потом перенес это в сервис и при останове вылетает сакраментальное "инструкция 0х0000000 обратилась по адресу 0х0000000 память не может быть "read"".
В чем прикол может быть?
Digitman (2003-04-21 17:41:00) [1]а запись в лог поставить ?
на Process/Thread Attach/Detach ?
max2057 (2003-04-21 15:11:00) [2]да
Digitman (2003-04-21 14:33:00) [3]IsMultiThread := True ??
max2057 (2003-04-21 13:23:00) [4]Извините за долгое молчание
я даже переделывал так что dll"ки грузит первичный поток до запуска вторичного но глюк оставался
Alex44 (2003-04-16 12:50:00) [5]
> 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.
viol-2 (2003-04-16 11:06:00) [6]У тебя случайно в dll нет нити?
если есть и ты ее перед выгрузкой терминейтишь то все понятно.
Anatoly Podgoretsky (2003-04-16 07:59:00) [7]Обычно так, только с небольшим отличеем.
function MyFunction(...): PChar
var
AnyPointer: string;
begin
AnyFunction(AnyPointer);
end;
boa (2003-04-16 07:26:00) [8]>max2057
А почему вы решили что именно в этих процедурах "косяк"?
Допустим ваша процедура в DLL имеет вид:
function MyFunction(...): PChar
var
s: string;
begin
...
Result := PChar(s)
end;
а в основной программе идет присвоение результата функции переменной (как у вас в примере) Если "время жизни" sменьше "времени жизни" r(а выгружается библиотека до завеншения программы) то вот тут вы и получите ваш "косяк".
max2057 (2003-04-15 15:37:00) [9]про AddObject не знал но сомневаюсь что это что-то меняет
Alex44 (2003-04-15 15:28:00) [10]A zachem takie slozhnosti s New i Dispose?
Pochemu ne AddObject(..., Pointer(DllHInst)) ?
max2057 (2003-04-15 14:14:00) [11]Sharemem - первый включаемый модуль в Dll и в проекте,
из Dll получаю строку, но через pchar
а глюк выскакивает только в сервисе в оконном варианте его нет
причем выскакивает он при попытке выгрузки последней Dll - я сначала думал, что Dll глючит и убрал ее из каталога с Dll,но глюк опять выскочил при выгрузке Dll которая стала последней
Роман Василенко (2003-04-15 14:01:00) [12]Есть осчусчение, что ты передаёшь/получаешь из модуля переменную типа string, а uses sharemem не сделал.
Если интересно - по почте.
max2057 (2003-04-15 13:36:00) [13]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;
Вот загрузка и выгрузка
вот код - где косяк?
Reystlin (2003-04-15 10:27:00) [14]Это довольно интересная проблема, у меня было такое при выгрузке DLL из памяти при явной загрузке, при чем убирая выгрузку из памяти, ошибка пропала (знаю, что это не правильно). Но никто мне помочть не смог, у всех все нормально, код у меня со всеми эдентичный, пример с компакта ишедшего с книгой.
Ошибка, вроде, в освобождении памяти, которая уже свободна. Но я могу и ошибаться, я еще только учусь.
Digitman (2003-04-15 09:57:00) [15]
> ошибка с этими адресами инструкции и памяти 0х0000000 -
> довольно специфическая
что ж в этом "специфического" ? imho, нет ничего "специфического" !
> Про отладку я и так знаю не надо мне философию разводить
знаешь ? а что же вопрос задаешь тогда ??
а уж коль растерялся, будь так любезен - приводи код !
max2057 (2003-04-15 09:38:00) [16]Умные, да? Про отладку я и так знаю не надо мне философию разводить.
Я знаю что ошибка с этими адресами инструкции и памяти 0х0000000 - довольно специфическая и где-то я читал про нее а вспомниить не могу
Digitman (2003-04-15 08:33:00) [17]
> В чем прикол может быть?
"Прикол" в том, что нужно заняться трассировкой/отладкой сервисного приложения. Само по себе (без отладки) ни одно приложение, ни у кого и никогда не заработает как положено.
Тётя Вася (2003-04-14 20:03:00) [18]Line #17