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

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

Add to AutoRun [D7, WinXP]


Страницы:   1 2

Goorus ©   (2004-08-27 13:09:00) 

Необходимо добавить ярлык в атозагрзку. В самой программе это получилось, но по завершении выдавалась ошибка. Думал это связано с неосвобождением объектов, но у интерфейсов нет метода Free, а _Release не помогал.
Попробывал написать простую демку(форма с кнопкой), работать стало ещё хуже :) Демка даже не добавляет себя в автозагрузку, хотя код не изменялся. Причина: в переменную Folder передаётся неверный путь ("С:\Docum^    "). Вот код:

procedure TForm1.Button1Click(Sender: TObject);
var List:PItemIdList;
  SLink:IShellLink;
 Folder:PChar;
begin
 // создаём ярлык в автозагрузке
 // находим папку
 SHGetSpecialFolderLocation(0, CSIDL_STARTUP, List);
 New(Folder);
 SHGetPathFromIDList(List, Folder);
 ShowMessage(Folder); // <- неверный путь
 // прописываемся
 SLink:=IShellLink(CreateComObject(CLSID_ShellLink));
 SLink.SetArguments('/a');
 SLink.SetDescription('My Prog');
 SLink.SetPath( PChar(ParamStr(0)) );
 (SLink as IPersistFile).Save(PWChar(WideString(Folder+'\prog.lnk')), False);
end;


Экспериментатор   (2004-08-28 14:58:00) [1]

Например, так
ну примерно так (Вызываешь в программе функцию SetAutoRun(True) и все дела)
var
 Ga_RegKey   : string = 'Имя программы';

function IsNT : boolean;
begin
 case Win32Platform of
   VER_PLATFORM_WIN32_NT: Result:=True;
     else Result:=False;
 end;
end;

procedure SetAutoRun( isCreate : boolean);
var  Reg: TRegistry;
begin
 Reg := TRegistry.Create;
 try
   if isNT then Reg.RootKey := HKEY_CURRENT_USER
     else Reg.RootKey := HKEY_LOCAL_MACHINE;
   if isCreate then
   begin
     if Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', False) then
     begin
       if Reg.ReadString(Ga_RegKey)<>ParamStr(0) then
       begin
         if(Application.MessageBox(
         'Добавить '+Ga_RegKey+' в автозагрузку?',
         'Добавление в автозагрузку',MB_ICONQUESTION + MB_YesNO + MB_DEFBUTTON2) = IDYES) then
         try
           Reg.WriteString(Ga_RegKey,ParamStr(0));
           Application.MessageBox(Ga_RegKey+' успешно добавлена в автозагрузку!',
              'Автозагрузка',MB_ICONINFORMATION + MB_OK);
         except
           Application.MessageBox(
             'Ошибка изменения реестра. Нет доступа!',
             'Автозагрузка',MB_ICONERROR + MB_OK);
         end
       end else Application.MessageBox(
           Ga_RegKey+' уже добавлена в автозагрузку!',
           'Автозагрузка',MB_ICONWARNING + MB_OK);
     end;
   end else
       begin
         if (Application.MessageBox('Вы действительно хотите убрать '+Ga_RegKey+' из автозагрузки?',
           'Удаление из автозагрузки', MB_ICONQUESTION + MB_YesNO + MB_DEFBUTTON2) = IDYES)
            and Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', False)
            and Reg.ValueExists(Ga_RegKey) then
            if Reg.DeleteValue(Ga_RegKey) then
               Application.MessageBox(
                 Ga_RegKey+' успешно удалена из автозагрузки!',
                 'Автозагрузка',MB_ICONINFORMATION + MB_OK)
            else
               Application.MessageBox(
                 Ga_RegKey+' не удалена из автозагрузки!'+
                 ^M+'Нет доступа!',
                 'Автозагрузка',MB_ICONSTOP + MB_OK);

       end;
 finally
   Reg.CloseKey;
   Reg.Free;
 end;
end;


Sanek_metaller   (2004-08-27 21:22:00) [2]

А через реестр не легче?


GrayFace   (2004-08-27 19:48:00) [3]

Удалено модератором


DiamondShark   (2004-08-27 16:31:00) [4]


> VMcL ©   (27.08.04 16:11) [28]

А я написал в [26].

Конечно, не видя описания catList -- это гадание на кофейной гуще. Но всё же, что-то мне подсказывает, что это просто TList, иначе, от чего же управление итемами не вынесено в него, а стоит сторонний цикл?

Да не в том дело, типизирован там Items или нет. Этот фрагмент был приведён в качестве образца как надо обращаться с интерфейсами. И не в кассу -- что закономерно, ибо как раз с интерфейсами там ситуация шибко нестандартная.


VMcL   (2004-08-27 16:28:00) [5]

>> jack128 ©  (27.08.04 16:21) [29]

И верно нет. Тады ой, судя по ACategory^.FriendlyName := Name;


jack128   (2004-08-27 16:21:00) [6]

VMcL ©   (27.08.04 16:11) [28]
Если правильно типизироватьпараметр Dispose

в коде правильной типизации нет.


VMcL   (2004-08-27 16:11:00) [7]

>> DiamondShark ©  (27.08.04 15:54) [25]

Насчет Dispose ты неправ. Если правильно типизировать параметр Dispose, то всё прекрасно финализируется. Можешь проверить по хелпу о Finalize.


jack128   (2004-08-27 16:04:00) [8]

DiamondShark ©   (27.08.04 15:54) [25]

> Но запись не будет финализирована

наследник может Notify перекрыть и там файнализировать. очень маловероятно и идеологически не верно, но возможно..


DiamondShark   (2004-08-27 16:03:00) [9]


> DiamondShark ©   (27.08.04 15:54) [25]

Впрочем, если это таки наследник, и свойство переопределено как типизированное (а не Pointer):

property Items[Index: integer]: PТрамПамПам;

то всё, конечно же, будет финализировано.


DiamondShark   (2004-08-27 15:54:00) [10]


> конечно с утечкой памяти возможны варианты (если CatList
> - реально не TList, а его наследник),

Не... Там итемы удаляются Dispose (самый первый for).
Конечно, саму запись Dispose удалит корректно, менеджер памяти с размерами разберётся. Но запись не будет финализирована. И если в ней есть управляемые поля (длинные строки, в частности), то они повиснут.


Danilka   (2004-08-27 15:52:00) [11]

[23] DiamondShark ©   (27.08.04 15:48)
Тем не менее, это не повод переходить к оскорблениям. Ты и без них все объяснил, зачем заходить так далеко?
С.м. 8-й пункт правил поведения на форуме.


DiamondShark   (2004-08-27 15:48:00) [12]


> WondeRu ©   (27.08.04 15:31) [19]

Ты взялся советовать. Причём, советовать а) не в кассу б) обладая представлениями, основанными не на понимании, а на обезьянском подражании тому, что тебе удалось где-то подсмотреть.
Первый намёк тебе на это был весьма сдержанный.


jack128   (2004-08-27 15:36:00) [13]

WondeRu ©   (27.08.04 15:23) [16]
но "Компилятор сам следит" ;-)

Ну так он же компилятор , а не искуственный интеллект (с) почти ЮЗ

> а чего скажешь насчет 12-го поста?

DS все расписал. конечно с утечкой памяти возможны варианты (если CatList - реально не TList, а его наследник), но  это маловероятно..


WondeRu   (2004-08-27 15:35:00) [14]

Удалено модератором


VMcL   (2004-08-27 15:33:00) [15]

> DiamondShark

Эта... полегче с выражениями.


WondeRu   (2004-08-27 15:31:00) [16]

[15]
как лягушку припарировал )

DiamondShark ©   (27.08.04 15:22) [15]
Так что удавись, ламерок.


эээхх! вроде взрослый человек, а ведет себя как ребенок!(
"Вам бы лечиться" © ;-)


Goorus   (2004-08-27 15:30:00) [17]

> Skier
Этот пример я взял за основу

New(Folder) - это тоже я взял из примера в ФАКе, и что самое удивительно к определённых случаях это работает :)

SLink:=nil;
Не помогало, уже пробывал. А реестр штука ненадёжная, а меню автозагрузки для того и существует, оттуда пользователю легче программы выкидывать :)

Всем спасибо!

Folder:array[0..1000] of Char; // гениально !!! ;)


DiamondShark   (2004-08-27 15:27:00) [18]

Удалено модератором


WondeRu   (2004-08-27 15:23:00) [19]

jack128 ©   (27.08.04 15:17) [14]
это и ежу понятно! но "Компилятор сам следит" ;-)
а чего скажешь насчет 12-го поста?

----
понимаю что выхожу в оффтоп, но охота разобраться че к чему


DiamondShark   (2004-08-27 15:22:00) [20]

Удалено модератором


Страницы:   1 2

Наверх

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