Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2011, 17:35   #1
paxan86
Пользователь
 
Регистрация: 18.05.2011
Сообщений: 49
Вопрос Вопрос по автозапуску программы в реестре

Правильно ли написан код?

Код:
procedure TForm1.FormCreate(Sender: TObject);
var
  h: TRegistry;
  dir :string;
begin
  h := TRegistry.Create;

//Запись
  with h do
  begin
    RootKey := HKEY_LOCAL_MACHINE;
    OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', true);
    getdir(0,dir);
    dir :=dir+'\AutoReboot.exe' ;
    WriteString('AutoReboot', dir);
    CloseKey;
    Free;
  end;   



//Удаление 
  with h do
  begin
   if OpenKey('Software\Microsoft\Windows\
 CurrentVersion\Run', False) then
 Begin
   DeleteValue( 'AutoReboot' );
   CloseKey();
   Free;
 end;
 end;
paxan86 вне форума Ответить с цитированием
Старый 21.12.2011, 18:58   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Кидайте ярлык программы в папку "Автозагрузка" и будет вам счастье.
Темболее не учитываете ситуацию, когда на машине несколько юзеров(и у каждого свой логин), а программа нужна только 1 человеку.

Кидайте в папку автозагрузка, либо пишите в HKEY_CURRENT_USER.

Вот мой метод:
Код:
procedure SetAutorunForMe(aForMe, aForAll: Boolean; aParam, aPath: string);
const
  RunKey = '\SOFTWARE\Microsoft\Windows\CurrentVersion\Run';
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    if aForMe then //Автозапуск для тек. ползьователя. Если да - прописываем, если нет - находим запись и удаляем
    begin
      Reg.RootKey := HKEY_CURRENT_USER;
      if Reg.OpenKey(RunKey, False) then
      begin
        if not Reg.ValueExists(aParam) then
        begin
          Reg.WriteString(aParam, aPath);
        end;
      end;
      Reg.CloseKey;
    end
    else  //Если не для текущего пользователя
    begin
      Reg.RootKey := HKEY_CURRENT_USER;
      if Reg.OpenKey(RunKey, False) then //Если удалось открыть ключ
      begin
        if Reg.ValueExists(aParam) then //КЕсли есть параметр
        begin
          Reg.DeleteValue(aParam); //Удаляем себя из автозагрузки
        end;
      end;
      Reg.CloseKey;
    end;

    if aForAll then //Автозапуск для всех. Если да - прописываем, если нет - находим запись и удаляем
    begin
      Reg.RootKey := HKEY_LOCAL_MACHINE;
      if Reg.OpenKey(RunKey, False) then
      begin
        if not Reg.ValueExists(aParam) then
        begin
          Reg.WriteString(aParam, aPath);
        end;
      end;
      Reg.CloseKey;
    end
    else
    begin
      Reg.RootKey := HKEY_LOCAL_MACHINE;
      if Reg.OpenKey(RunKey, False) then
      begin
        if Reg.ValueExists(aParam) then
        begin
          Reg.DeleteValue(aParam);
        end;
      end;
      Reg.CloseKey;
    end;
  finally
    FreeAndNil(Reg);
  end;
end;
Человек_Борща вне форума Ответить с цитированием
Старый 21.12.2011, 21:17   #3
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Правильно ли написан код?
Код написан ужасно и неправильно.

У Человека_Борща лучше, хотя есть пара мелких недочётов.

Кстати, я бы тоже рекомендовал посмотреть на добавление в папку Автозагрузка вместо использования реестра. Это существенно дружелюбнее к пользователю.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 21.12.2011, 21:25   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
У Человека_Борща лучше, хотя есть пара мелких недочётов.
Можно узнать какие?
Человек_Борща вне форума Ответить с цитированием
Старый 21.12.2011, 21:43   #5
paxan86
Пользователь
 
Регистрация: 18.05.2011
Сообщений: 49
По умолчанию

Спасибо большое!) но выдаёт ошибки...
if Reg.OpenKey(RunKey, False) then
EStackOverflow
paxan86 вне форума Ответить с цитированием
Старый 21.12.2011, 21:45   #6
paxan86
Пользователь
 
Регистрация: 18.05.2011
Сообщений: 49
По умолчанию

а почему не правильно?))
у меня заносилась в реестр запись)
paxan86 вне форума Ответить с цитированием
Старый 21.12.2011, 21:46   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Можно узнать какие?
1. aForMe - название настолько не интуитивно, что потребовался разъясняющий комментарий. Намного лучше было бы что-то вроде AInstall: Boolean; Аналогично с aForAll.

2. Может это и спорно, но мне кажется, что не очень удачна идея с двумя aForMe и aForAll по таким причинам:
а). Если ты ставишь aForAll, то этим же ставишь aForMe (ну, тот же эффект).
б). HKCU и HKLM требуют разных прав доступа к реестру и комбинировать их в одном проходе процедуры не стоит.
Я бы сделал AInstall: Boolean (True - установить, False - удалить) и AGlobal: Boolean (True - HKLM, False - HKCU).

3. Дублирование кода. Проверку надо делать не в начале, а в самом конце, когда идёт выбор между WriteString и DeleteValue.

4. CloseKey вроде не обязателен, деструктор сам всё сделает.

Цитата:
а почему не правильно?))
Код для удаления отличается от добавления. Нет RootKey и \. Это - ошибки (хотя вторая не критична).

Могу перечислить недостатки кода.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.

Последний раз редактировалось GunSmoker; 21.12.2011 в 21:58.
GunSmoker вне форума Ответить с цитированием
Старый 21.12.2011, 22:18   #8
paxan86
Пользователь
 
Регистрация: 18.05.2011
Сообщений: 49
По умолчанию

Человек_Борща, спасибо за код но он ошибку выдаёт

if Reg.OpenKey(RunKey, False) then
Ошибка>> EStackOverflow

сорри у меня ошибка где то...)

Последний раз редактировалось paxan86; 21.12.2011 в 22:26.
paxan86 вне форума Ответить с цитированием
Старый 21.12.2011, 22:47   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

У меня и в delphi 7 и в XE2 работает на ура, вот уже 6 месяцев без ошибок.

GunSmooker, благодарен.

Но пропроверку доступка к ресстру, это о проверки адм. привелегий или KEY_ALL_ACCESS?

Вот чуток оптимизировал:
Код:
{-------------------------------------------------------------------------------
  Процедура: SetAutorunForMe1
  Автор:    Супчег
  Дата:  2011.12.21
  Входные параметры:
  var
  aExeFile,      - Название
  aPath: string; - пусть к программе

  const
  aInstall: boolean = True; - Запись в автозапуск(True), иначе удаление
  aGlobal: boolean = False  - Для всех пользователей(True), иначе для текущего.
  Описание:

-------------------------------------------------------------------------------}
procedure SetAutorunForMe1(var aExeFile, aPath: string; const aInstall: boolean
  =
  True; aGlobal: boolean = False);
const
  RunKey = '\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\';
var
  Reg: TRegistry;
begin
  if aGlobal then
  begin
    Reg := TRegistry.Create(KEY_ALL_ACCESS);
    Reg.RootKey := HKEY_LOCAL_MACHINE
  end
  else
  begin
    Reg := TRegistry.Create;
    Reg.RootKey := HKEY_CURRENT_USER;
  end;

  try
    if Reg.openKey(RunKey, False) then
    begin
      if aInstall then
      begin
        if not Reg.ValueExists(aExeFile) then
          Reg.WriteString(aExeFile, aPath);
      end
      else
      begin
        if Reg.ValueExists(aExeFile) then
          Reg.DeleteValue(aExeFile);
      end;
    end;
  finally
    FreeAndNil(Reg);
  end;
end;

Последний раз редактировалось Человек_Борща; 21.12.2011 в 22:52.
Человек_Борща вне форума Ответить с цитированием
Старый 21.12.2011, 23:28   #10
paxan86
Пользователь
 
Регистрация: 18.05.2011
Сообщений: 49
По умолчанию

Кул спасибо!=)

Последний раз редактировалось paxan86; 22.12.2011 в 00:03.
paxan86 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вопрос тем, кто пишет программы на заказ. demidov_andrey Помощь студентам 1 03.01.2010 22:17
Хотел бы задать вопрос по поводу рекурсивной программы GUnt Паскаль, Turbo Pascal, PascalABC.NET 1 27.12.2008 22:16
Вопрос оптимизации программы на С++ argrus Помощь студентам 9 29.03.2008 23:54
пути в реестре, где находятся программы автозагрузки для win'95 win'98 win' me win 2000 Prisian Win Api 1 11.09.2007 20:07
Вопрос по написанию программы Canadec БД в Delphi 1 22.07.2007 18:38