Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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.48 MB
Время: 0.007 c
4-97933
Bonial
2003-04-20 02:41
2003.06.30
Как запретить доступ к папке?


14-97870
Mike B.
2003-06-10 17:27
2003.06.30
Ваши комментарии


11-97572
Alexander
2002-10-14 09:15
2003.06.30
Почему вылетает программа с таким кодом:


14-97866
HolyGlory
2003-06-12 14:08
2003.06.30
По VC++


7-97892
Pitay
2003-04-20 21:08
2003.06.30
LPT -> USB в DOS





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский