Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка EAccesViolation в программе, showMessage исключает ошибку 
:(
    Опции темы
SlaUr
Дата 25.7.2014, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: 1
Всего: 5



Вот код процедуры
Код

Procedure scanAllRun;
var r:tregistry;i2,i1:integer;yES:Boolean;St1,St2:string;
begin
with form1 do
begin
ShowMessage('1');

ListAllRun.Clear; CheckListBox1.Clear;
r:=TRegistry.Create(KEY_READ);
R.RootKey:=HKEY_LOCAL_MACHINE;
if R.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',False) then R.GetValueNames(ListAllRun);

for i2:=0 to ListAllRun.Count-1 do
begin
Yes:=False;
St1:='';
if r.ValueExists(ListAllRun.Strings[i2]) then St1:=r.ReadString(ListAllRun.Strings[i2]) ;
St2:=St1;
St1:=StrUp(St1);
 ListAllRun.Strings[i2]:=ListAllRun.Strings[i2]+'|RUN|'+St2;
end;
r.CloseKey;

Lista:=tstringlist.Create;
if R.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunOnce',False) then R.GetValueNames(ListA);
for i2:=0 to ListA.Count-1 do
begin
St1:=r.ReadString(ListA[i2]) ;
ListAllRun.Add(ListA[i2]+'|RUNONCE|'+St1);
end;
r.CloseKey;
Lista.Free;

if FindFirst(PathStartupAll+'*.LNK',faAnyFile,S1) = 0 then ListAllRunAdd;
While FindNext(s1)=0 do ListAllRunAdd;

for i2:=0 to ListAllRun.Count-1 do
begin
if tNFi(2,ListAllRun.Strings[i2])='AllStartup' then
CheckListBox1.Items.Add(tNFi(1,ListAllRun.Strings[i2])+probel+'|AllStartup|'+tNFi(3,ListAllRun.Strings[i2]));
if tNFi(2,ListAllRun.Strings[i2])='RUN' then
CheckListBox1.Items.Add(tNFi(1,ListAllRun.Strings[i2])+probel+'|RUN|'+tNFi(3,ListAllRun.Strings[i2]));
if tNFi(2,ListAllRun.Strings[i2])='RUNONCE' then
CheckListBox1.Items.Add(tNFi(1,ListAllRun.Strings[i2])+probel+'|RUNONCE|'+tNFi(3,ListAllRun.Strings[i2]));
end;
for i2:=0 to CheckListBox1.Items.Count-1 do CheckListBox1.Checked[i2]:=True;
r.RootKey:=HKEY_LOCAL_MACHINE;
r.OpenKey('SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg',FALSE);
Lista:=tstringlist.Create;
ListA.Clear;
R.GetKeyNames(ListA);
r.CloseKey;


for i1:=0 to ListA.Count-1 do
begin
r.OpenKey('SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg\'+ListA[i1],FALSE);
if r.ReadString('hkey')= 'HKLM' then
 if StrUp(r.ReadString('key'))=StrUp('Software\Microsoft\Windows\CurrentVersion\Run') then
  CheckListBox1.Items.Add(ListA[i1]+probel+'|RUNBAK|'+r.ReadString('command'));
r.CloseKey;
end;


r.OpenKey('SOFTWARE\Microsoft\Shared Tools\MSConfig\startupfolder',FALSE);
ListA.Clear;
R.GetKeyNames(ListA);
r.CloseKey;

for i1:=0 to ListA.Count-1 do
begin
r.OpenKey('SOFTWARE\Microsoft\Shared Tools\MSConfig\startupfolder\'+ListA[i1],FALSE);
 if StrUp(ExtractFileDir(r.ReadString('path')))=DelSlash(StrUp(PathStartupAll)) then
  CheckListBox1.Items.Add(r.ReadString('item')+probel+'|STARTUPALLBAK|'+ListA[i1]);
r.CloseKey;
end;

if backuppunkt<>'' then
for i1:=0 to CheckListBox1.Count-1 do
    if tnfi(1,CheckListBox1.items[i1])=backuppunkt then
     begin
      CheckListBox1.ItemIndex:=i1;
      break;
     end;

backuppunkt:='';

r.Free;

end;
end;



Если убрать ShowMessage('1') то возникает ошибка  что делать ?

Это сообщение отредактировал(а) SlaUr - 25.7.2014, 16:04
PM MAIL   Вверх
Illusion Dolphin
Дата 25.7.2014, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 5
Всего: 63



Запустите из IDE в режиме отладки и укадите строчку, на которой остановилась программа при ошибке, дополнительно неплохо было бы указать call-stack.

Дополнительно отформатируйте, пожалуйста, код - если там ошибка дальше 3й строки то ничего не понятно. 


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
SlaUr
Дата 25.7.2014, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: 1
Всего: 5



спасибо за совет буду разбираться с отладчиком.
Но меня  интересует почему при ShowMessage ошибка пропадает.
PM MAIL   Вверх
Illusion Dolphin
Дата 25.7.2014, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 5
Всего: 63



Цитата

Но меня  интересует почему при ShowMessage ошибка пропадает. 

ShowMessage создаёт модальное окно и прекращает на время выполнение данного кода, хотя другой код может выполняться. Ошибку надо смотреть в дебаге. 


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
SlaUr
Дата 27.7.2014, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: 1
Всего: 5



Вылетает ошибка на строке ListAllRun.Clear 
фигня какая-то 
PM MAIL   Вверх
БелАмор
Дата 27.7.2014, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 10.6.2010
Где: Россия

Репутация: 7
Всего: 17



Цитата(SlaUr @  27.7.2014,  14:12 Найти цитируемый пост)
Вылетает ошибка на строке ListAllRun.Clear 

А вы уверены?
В строке ListAllRun.Clear; CheckListBox1.Clear;
имеется два оператора. Как вы определили, что ошибка возникла именно на первом?
Присоединяюсь к призыву форматировать текст.

Ошибка может быть не в приведённом куске.
В частности, неизвестно, где создаётся ListAllRun и не уничтожался ли он.
Небольшое изменение кода может привести к тому, что в одном случае работа по указателю на уничтоженный объект вызовет ошибку, а в другом - нет. Проверьте, что ListAllRun на момент вызова scanAllRun создан и не уничтожен.

Если вышеизложенное не поможет, имеет смысл привести побольше кода, где можно было бы проследить что как создаётся с самого начала. В частности, существует ли на момент вызова form1 и т.д.

Кстати, зачем нужна завязка на глобальную переменную form1? Зачем вашй процедуре что-то знать о ней?
Возможно, я что-то просмотрел, но, вроде бы от form1 здесь используется только CheckListBox1.
И только из-за него вы всё засунули под with form1 do ?
Если вам с form1 нужен только CheckListBox1, так и передавайте его в процедуру параметром:
Procedure scanAllRun(ACheckListBox: TCheckListBox);
Если через параметр передавать ещё и ListAllRun, так вообще получится полностью автономная процедура, ни к чему не привязанная, которую можно испозьзовать где угодно, не интересуясь именами глобальных переменных.
Но это потом, а сначала надо разобраться с проблемой в текущем виде.

PM   Вверх
Illusion Dolphin
Дата 27.7.2014, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 5
Всего: 63



Ещё судя по тому, что процедура scanAllRun статическая, а доступ идёт к форме то возможно формы ещё нету или уже нету. Call-stack бы это показал.


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
SlaUr
Дата 28.7.2014, 06:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: 1
Всего: 5



Цитата

А вы уверены?
В строке ListAllRun.Clear; CheckListBox1.Clear;
имеется два оператора. Как вы определили, что ошибка возникла именно на первом?

очень просто  когда у меня возникала ошибка на первой строке я его поставил на 4 строку и программа стала вылетать после прохождения 4 строки

Цитата

Ещё судя по тому, что процедура scanAllRun статическая, а доступ идёт к форме то возможно формы ещё нету или уже нету.

Нет у меня эта процедура выполняется во первых когда создается форма (тогда ошибки не возникает) и при нажатии кнопки (тогда и возникает ошибка)
Цитата

Ещё судя по тому, что процедура scanAllRun статическая, а доступ идёт к форме то возможно формы ещё нету или уже нету


ListAllRun создается при создании формы

Это сообщение отредактировал(а) SlaUr - 28.7.2014, 06:07
PM MAIL   Вверх
SlaUr
Дата 28.7.2014, 06:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: 1
Всего: 5



Исключил ListAllRun из кода и тогда ошибка возникает 
в строке
Код

if R.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',False) then R.GetValueNames(ListAllRun);


Опять же ошибка возникает с  ListAllRun.

Ладно буду экспериминтировать дальше

Это сообщение отредактировал(а) SlaUr - 28.7.2014, 06:48
PM MAIL   Вверх
БелАмор
Дата 28.7.2014, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 10.6.2010
Где: Россия

Репутация: 7
Всего: 17



Цитата(SlaUr @  28.7.2014,  07:16 Найти цитируемый пост)
Ладно буду экспериминтировать дальше

Странный у вас подход...
Ошибка уже найдена.
Со 100% вероятностью.
Вот она:
Указатель ListAllRun не указывает на реально существующий объект.
Осталось только найти причину этого.
Вам нужно пройти цепочку:

1. Создание ListAllRun:   ListAllRun := TStringList.Create;
2. Место, где уничтожается объект, на который указывает ListAllRun, например:   ListAllRun.Free;
3. Вызов scanAllRun, в котором возникает ошибка:   scanAllRun;

Проблема лежит за пределами scanAllRun.
Ваша задача сводится к поиску пункта 2.
Вам предложили привести код, чтобы помочь найти совместно.
Вы говорите, что это всё ерунда и ошибки там быть не может.
Пожалуйста. Ищите сами. Ошибку вам указали.
У меня хватает фантазии только на три варианта:

1. Вы создаёте ListAllRun в неудачном месте.
2. Где-то ListAllRun уничтожается.
3. Где-то объект, на который указывает ListAllRun уничтожается и вновь создаётся, но в переменной ListAllRun сохраняется старый указатель на уже уничтоженный объект.

PM   Вверх
SlaUr
Дата 28.7.2014, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: 1
Всего: 5



Попробовал этот же проект в Delphi 7 (до этого работал в Delphi 2010)  и все стало нормально - никаких ошибок .
Удалил со своего компа 2010 поставил 7 . 
Вообще проект писался давно в delphi7. 

Это сообщение отредактировал(а) SlaUr - 28.7.2014, 12:07
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0767 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.