Здравствуйте, Гость
Среда, 20.09.2017, 04:28
Главная Главная страница форума Регистрация Вход
Новые сообщения Участники форума Правила форума Поиск
Страница 1 из 11
Модератор форума: stalker, Ekz 
Форум » Все о Delphi » Начинающим » Помогите пожалуйста исправить код!!! (Я написал код, но после запуска выдается ошибка!!!)
Помогите пожалуйста исправить код!!!
dimon-zmeyДата: Четверг, 31.12.2009, 17:36 | Сообщение # 1
Ранг 1
Группа: Пользователи
Сообщений: 4
Награды: 0
Репутация: 0
Статус: Offline
Пожалуйста исправьте мои ошибки.
При запуске программы, она запускается, но пишет ошибку!!!
Я начал работать в Delphi только позавчера, поэтому много не знаю!!!

Ошибка:
Проект Project2.exe вызвал исключение класса EAccessViolation с сообщением 'Access violation at address 00000000. Read of address 00000000'. Процесс остановлен. Используйте Шаг или Запуск для продолжения.

Мой код:

Code

var
reg:TRegistry;

data : integer;
time : integer;
datadata : integer;
timetime : integer;

datacomp : integer;
timecomp : integer;

hToken: THandle;
tkp: TTokenPrivileges;
ReturnLength: Cardinal;
Begin
ShowWindow(Handle,SW_HIDE);
ShowWindow(Application.Handle,SW_HIDE);

reg:=TRegIniFile.Create;
reg.RootKey:=HKEY_CURRENT_USER;
reg.OpenKey('Software\Comp-OFF\Time', false);
data:=StrToint(reg.ReadString('data-off'));
time:=StrToint(reg.ReadString('time-off'));
reg.CloseKey;
reg.Free;

datacomp := StrToint(FormatDateTime('yyyymmdd',now));
timecomp := StrToint(FormatDateTime('hhmm',now));

datadata := data - datacomp;
timetime := time - timecomp;

if datadata > 0 then
if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or
TOKEN_QUERY, hToken) then
begin
LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid);
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
if AdjustTokenPrivileges(hToken, False, tkp, 0, nil, ReturnLength) then
ExitWindowsEx(EWX_ShutDown,0);// Выключение
end;

if datadata = 0 then
if timetime > 0 then
if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or
TOKEN_QUERY, hToken) then
begin
LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid);
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
if AdjustTokenPrivileges(hToken, False, tkp, 0, nil, ReturnLength) then
ExitWindowsEx(EWX_ShutDown,0);// Выключение
end;

if datadata = 0 then
if timetime = 0 then
if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or
TOKEN_QUERY, hToken) then
begin
LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid);
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
if AdjustTokenPrivileges(hToken, False, tkp, 0, nil, ReturnLength) then
ExitWindowsEx(EWX_ShutDown,0);// Выключение
end;

if datadata = 0 then
if timetime < 0 then
reg:=TRegIniFile.Create;
reg.RootKey:=HKEY_CURRENT_USER;
reg.OpenKey('Software\Comp-OFF\Time', false);
reg.DeleteValue('data-off');
reg.DeleteValue('time-off');
reg.CloseKey;
reg.Free;

reg:=TRegIniFile.Create;
reg.RootKey:=HKEY_CURRENT_USER;
reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', false);
reg.DeleteValue('Comp-OFF');
reg.CloseKey;
reg.Free;

Form1.Close;

if datadata < 0 then
reg:=TRegIniFile.Create;
reg.RootKey:=HKEY_CURRENT_USER;
reg.OpenKey('Software\Comp-OFF\Time', false);
reg.DeleteValue('data-off');
reg.DeleteValue('time-off');
reg.CloseKey;
reg.Free;

reg:=TRegIniFile.Create;
reg.RootKey:=HKEY_CURRENT_USER;
reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', false);
reg.DeleteValue('Comp-OFF');
reg.CloseKey;
reg.Free;

Form1.Close;
end;

Я хочу, чтоб прога прочитала данные с реестра и отняла от них дату и время!
Если данные с реестра (Дата) - дата > 0, то выкл. комп

Если данные с реестра (Дата) - дата = 0, то
Если данные с реестра (Время) - время > 0, то выкл. комп

Если данные с реестра (Дата) - дата = 0, то
Если данные с реестра (Время) - время = 0, то выкл. комп

Если данные с реестра (Дата) - дата = 0, то
Если данные с реестра (Время) - время < 0, то удаление данных с реестра + удаление с автозапуска + выход с программы

Если данные с реестра (Дата) - дата < 0, то удаление данных с реестра + удаление с автозапуска + выход с программы

Пожалуйста, помогите!!! Я хочу закончить программу к новому году, а он уже через 11 часов!!! cry

 
AdminДата: Пятница, 01.01.2010, 01:52 | Сообщение # 2
Ранг 10
Группа: Пользователи
Сообщений: 1268
Награды: 16
Репутация: 2
Статус: Offline
Ну у меня то уже новый год наступил как почти два часа назад, но все же помогу.

В какой момент (при выполнении какой инструкции) происходит ошибка? Поставьте точку останова в начале кода, и F8 пробегите до ошибки.

И вообщето я всегда делал так:

Code
reg:=TRegistry.Create;

А еще в этом куске кода

Code
if datadata = 0 then  
if timetime < 0 then  
reg:=TRegIniFile.Create;  
reg.RootKey:=HKEY_CURRENT_USER;  
reg.OpenKey('Software\Comp-OFF\Time', false);  
reg.DeleteValue('data-off');  
reg.DeleteValue('time-off');  
reg.CloseKey;  
reg.Free;

похоже на то, что нехватает операторных скобок Begin ... end
Без них инструкция reg:=TRegIniFile.Create; будет не всегда выполняться, но код ниже всегда, а без создания объекта ничего не выйдет.


Не оказываю помощь через личные сообщения и ICQ
 
dimon-zmeyДата: Пятница, 01.01.2010, 02:27 | Сообщение # 3
Ранг 1
Группа: Пользователи
Сообщений: 4
Награды: 0
Репутация: 0
Статус: Offline
Огромное спасибо!!! Я во всем разобрался!!! Дело было в begin...end!!! Я закончил программу за 1 час до нового года!!!

Сообщение отредактировал dimon-zmey - Пятница, 01.01.2010, 02:41
 
Форум » Все о Delphi » Начинающим » Помогите пожалуйста исправить код!!! (Я написал код, но после запуска выдается ошибка!!!)
Страница 1 из 11
Поиск:

Copyright DelphiDevelop.ru © 2008-2017
Хостинг от uCoz