Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

инструкция 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


Наверх

Титульная страница Поиск, карта сайта Написать письмо