Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.02.26;
Скачать: CL | DM;

Вниз

Автозагрузка проги в Windows XP sp3   Найти похожие ветки 

 
Aleks   (2011-11-16 14:09) [0]

Написал прогу напоминалку. Хочу чтобы пользователь мог добавить ее в автозагрузку при желании. Использую вариант с внесением в папку "Автозагрузка" ОС(лучше варианта с реестром,так-как в Виндовс 7,для доступа к ключу HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run нужны права администратора). Код такой:

procedure addAutoRun(const filename:string);
var
 Folder: array[0..255] of Char;
 List: PitemidList;
 lnk,sd : String;
begin
 lnk := ChangeFileExt(filename,".lnk");
 SHGetSpecialFolderLocation(0,CSIDL_STARTUP,List);
 FillChar(Folder, SizeOf(Folder), 0);
 SHGetPathFromIDList(List, @Folder);
 GetDir(0,sd);
 ChDir(folder);
   CreateLink(filename,lnk,"","");
   CopyFile(PChar(lnk), PChar(ChangeFileExt(ExtractFileName(lnk),"")+".lnk"), true);
   DeleteFile(lnk);
 ChDir(sd);
end;

addAutoRun(Application.ExeName);

Программа успешно добавляется в автозагрузку,но при загрузке Windows XP вылетает приблизительно такое окно с ошибкой: " is not valid integer value. Если вручную перетянуть пусковой файл на Пуск-Автозагрузка и перегрузить ПК,то программа запускается без ошибок. Ручной запуск происходит тоже без ошибок. Видимо собака зарыта в процедуре внесения в автозагрузку,но где не понятно :(


 
Андреевич   (2011-11-16 14:15) [1]


> Видимо собака зарыта в процедуре внесения в автозагрузку,
> но где не понятно :(

или не указана рабочая директория программы в параметрах ярлыка, а программа была написана без учета этого варианта. соответственно ошибка не в процедуре внесения в автозагрузку, а в проге в другом месте


 
clickmaker ©   (2011-11-16 14:27) [2]

> " is not valid integer value

ищи, где StrToInt используется или что-то типа


 
Aleks   (2011-11-16 14:38) [3]

А как при внесении в автозагрузку указать в свойствах ярлыка рабочую папку программы?


 
Омлет ©   (2011-11-16 15:13) [4]

1. Наверное, программа ищет какой-то файл в директории по умолчанию. Ищи в программе ошибку.

2. Зачем создавать ярлык в одном месте, потом копировать в другое и удалять в первом, если можно сразу создать в нужном месте?

Код создания ярлыка в автозапуске с указанием рабочей директории:

uses
 ActiveX, ComObj, ShlObj, SHFolder;

function GetSpecialFolderPath(folder : integer) : string;
const
 SHGFP_TYPE_CURRENT = 0;
var
 path: array [0..MAX_PATH] of char;
begin
 if SUCCEEDED(SHGetFolderPath(0, folder, 0, SHGFP_TYPE_CURRENT, @path[0])) then
   Result := path
 else
   Result := "";
end;

function CreateLink(const sFile, sLinkFile, sDescription, WorkingDir: string): Boolean;
const
 IID_IPersistFile: TGUID = (
   D1:$0000010B;D2:$0000;D3:$0000;D4:
  ($C0,$00,$00,$00,$00,$00,$00,$46));
var
 pfLink : IPersistFile;
 islLink: IShellLink;
begin
 Result := False;
 if CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IID_IShellLinkA, islLink) = NO_ERROR then
   with islLink do begin
     SetPath(PChar(sFile));
     SetWorkingDirectory(PChar(WorkingDir));
     //SetIconLocation(PChar(WorkingDir), 0);
     SetDescription(PChar(sDescription));
     if QueryInterface(IID_IPersistFile, pfLink) = NO_ERROR then begin
       pfLink.Save(StringToOLEStr(sLinkFile), True);
       Result := True;
     end;
   end;
end;

function addAutoRun(const FileName, LinkComment: string): boolean;
var
 AutorunFolder: string;
begin
 AutorunFolder := GetSpecialFolderPath(CSIDL_STARTUP);
 Result :=  (AutorunFolder <> "") and
   CreateLink(FileName,
     IncludeTrailingPathDelimiter(AutorunFolder) +
        ChangeFileExt(ExtractFileName(FileName), ".lnk"),
     LinkComment,
     ExcludeTrailingPathDelimiter(ExtractFilePath(FileName))
   );
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
 if not addAutoRun(Application.ExeName, "My Super program") then
   ShowMessage("fail");
end;


3. Учись пользоваться яндексом.


 
Омлет ©   (2011-11-16 15:29) [5]


> 2. Зачем создавать ярлык в одном месте, потом копировать
> в другое и удалять в первом...

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


 
Aleks   (2011-11-16 17:03) [6]

Спасибо Большое всем за ценные советы! Буду пробовать...


 
Aleks   (2011-11-16 17:29) [7]

>Омлет Приведенный тобою код работает,но создает почему-то пустой ярлык
без указания имени файла и рабочей директории,вызываю так: addAutoRun(Application.ExeName, "MyProgram")


 
Омлет ©   (2011-11-16 21:07) [8]


> Aleks   (16.11.11 17:29) [7]
> Приведенный тобою код работает,но создает почему-то пустой
> ярлык

хз.. XPSP3+D7 - всё работает.


 
Aleks   (2011-11-16 22:30) [9]

Компилил в Embarcadero Delphi 2010,не работало. Решил сабж так:

function CreateShortcut(const CmdLine, Args, WorkDir, LinkFile: string):
 IPersistFile;
var
 MyObject: IUnknown;
 MySLink: IShellLink;
 MyPFile: IPersistFile;
 WideFile: WideString;
begin
 MyObject := CreateComObject(CLSID_ShellLink);
 MySLink := MyObject as IShellLink;
 MyPFile := MyObject as IPersistFile;
 with MySLink do
 begin
   SetPath(PChar(CmdLine));
   SetArguments(PChar(Args));
   SetWorkingDirectory(PChar(WorkDir));
 end;
 WideFile := LinkFile;
 MyPFile.Save(PWChar(WideFile), False);
 Result := MyPFile;
end;

procedure addAutoRun(const FileName, LinkComment: string);
var
AutorunFolder,FullFileName,s: string;
begin
FullFileName := GetRunDir + PathDelim + FileName;
AutorunFolder := GetSpecialFolderPath(CSIDL_STARTUP);
s:=ExtractFilePath(ParamStr(0));
CreateShortcut(s + "Reminder.exe", "", s, AutorunFolder + "\Reminder.lnk");
end;

addAutoRun(Application.ExeName,"Reminder");

Все заработало! :)


 
Dennis I. Komarov ©   (2011-11-17 00:27) [10]

Зачем делать ярлык программно, если это прерогатива пользователя? Или ему эта ноша не под силу? Если инстал - в реестр, если пользователь - сам его проблемы, что закинуть в "Автозагрузку".


 
antonn ©   (2011-11-17 02:24) [11]


> Или ему эта ноша не под силу?

ему удобнее когда это делается нажатием одной кнопки в программе


 
Dennis I. Komarov ©   (2011-11-17 09:07) [12]


> ему удобнее когда это делается нажатием одной кнопки в программе

баловство, порождающее проблемы...


 
antonn ©   (2011-11-17 10:29) [13]


> баловство, порождающее проблемы...

отнюдь, во многих программах в настройках есть пункт "добавить в автозагрузку" (если ей это необходимо), где можно быстро и удобно добавить/удалить программу из автозагрузки. Пора бы уже вылезти из каменного века :)


 
Dennis I. Komarov ©   (2011-11-17 10:44) [14]


> отнюдь, во многих программах в настройках есть пункт "добавить
> в автозагрузку" (если ей это необходимо), где можно быстро
> и удобно добавить/удалить программу из автозагрузки.

Т.е. в программах, в своем интерфейсе каждой, где-то есть волшебная галочка. Чем способ "перетащить удерживая Shift + Ctrl" менее удобен? А вот универсален он будет для любой программы. Плюс пользователь это делает осознано.


> во многих программах в настройках есть пункт "добавить в
> автозагрузку"

Для администратора и с записью в реестр.


 
Anatoly Podgoretsky ©   (2011-11-17 11:43) [15]

> Dennis I. Komarov  (17.11.2011 10:44:14)  [14]

А устанавливал программу Вася Пупкин с улицы


 
Андреевич   (2011-11-17 11:54) [16]


> Чем способ "перетащить удерживая Shift + Ctrl" менее удобен?
>  А вот универсален он будет для любой программы. Плюс пользователь
> это делает осознано.

Тем что он требует нажатия шифта и контрола, плюс открытие папки автозагрузки, и надо знать где она есть. А можно нажать одну кнопку в программе, поставить один чекбокс. Удобство очевидно.


> Для администратора и с записью в реестр.

ничто не мешает быть юзеру администратором, а метод добавления в автозагрузку выбирает разработчик. Пока папка "автозагрузка" тоже неплохо с этим справляется


 
Dennis I. Komarov ©   (2011-11-17 12:05) [17]


> А устанавливал программу Вася Пупкин с улицы

И что?


> Тем что он требует нажатия шифта и контрола, плюс открытие
> папки автозагрузки, и надо знать где она есть. А можно нажать
> одну кнопку в программе, поставить один чекбокс. Удобство
> очевидно.

Вот из-за таких удобств они и не знают то, что им знать положено. А что делает этот чекбокс покрыто тайнами машинного кода... т.е. [12]


> ничто не мешает быть юзеру администратором, а метод добавления
> в автозагрузку выбирает разработчик. Пока папка "автозагрузка"
> тоже неплохо с этим справляется

Обычно сисадмин этому мешает, и правильно делает...


 
Anatoly Podgoretsky ©   (2011-11-17 12:17) [18]

> Андреевич  (17.11.2011 11:54:16)  [16]

В ХР она доступна из меню, только перетаскивать лучше с помощью ALT


 
OW ©   (2011-11-17 12:44) [19]

Имхо, если только при установке
отказался/согласился от/на  автозапуска

а потом такая фишка совсем не нужна.


 
Андреевич   (2011-11-17 12:48) [20]


> Вот из-за таких удобств они и не знают то, что им знать
> положено.

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

> А что делает этот чекбокс покрыто тайнами машинного кода.
> .. т.е.

конечно же нет, этот чекбокс добавляет прогу в автозагрузку. никаких тайн.


> Anatoly Podgoretsky ©   (17.11.11 12:17) [18]
> > Андреевич  (17.11.2011 11:54:16)  [16]
>
> В ХР она доступна из меню, только перетаскивать лучше с
> помощью ALT

что, наводить на пуск, потом рыскать в меню пока не раскроется нужный пункт? при этом возюкая мышкой с зажатой кнопкой и альтом? это удобнее чем сознательно нажать кнопку в ПО производящую туже самую операцию в один клик?


 
Андреевич   (2011-11-17 12:48) [21]


> Имхо, если только при установке

какой установке? unzip - установка? :)


 
Dennis I. Komarov ©   (2011-11-17 12:53) [22]


> с чего бы это "положено"? а ты знаешь как заменить задний
> мост на уазике? а обязан ты это знать будучи водителем уазика,
>  а не его механиком?

С того, что он пользователь. И не надо тут мух с котлетами мешать... Аналогия не уместна.

> конечно же нет, этот чекбокс добавляет прогу в автозагрузку.
>  никаких тайн.

Пользователю об этом ничего не известно...


 
OW ©   (2011-11-17 12:57) [23]


> unzip - установка? :)

кто анзип умеет юзать - тот уже почти профессор :)
ему кнопка в интерморде для автозагрузке не нада


 
Андреевич   (2011-11-17 12:58) [24]


> С того, что он пользователь. И не надо тут мух с котлетами
> мешать... Аналогия не уместна.

еще как уместна, пользователь потому и пользователь, что не обязан всего знать, именно поэтому компьютер сейчас в доме встречается не реже микроволновки, потому что за пользователя думает производитель не обязывая первого перед эксплуатацией читать талмуды на 1000 листов.


> Пользователю об этом ничего не известно...

разумеется известно, почему нет? написано же - "запускать со стартом системы", значит все известно. Конечно же там код добавления в автозагрузку тем методом который необходим в данный момент.


 
Dennis I. Komarov ©   (2011-11-17 12:59) [25]

Простой пример:
Пользователь взял твою софтину, поюзал ее, при этом поставил твой заветный чекбокс. Через неделю надоела - снес к чертям. Откуда он должен узнать про хитрый ярлык в папке "Автозагрузка"?


 
Андреевич   (2011-11-17 12:59) [26]


> кто анзип умеет юзать - тот уже почти профессор :)

ладно, скажем иначе - portable :)
можно даже без паспаковки из архива


 
Андреевич   (2011-11-17 13:00) [27]


> Через неделю надоела - снес к чертям.

как снес?


 
OW ©   (2011-11-17 13:09) [28]


> как снес?

а как можно снести

> portable :)
> можно даже без паспаковки из архива

?

delete кнопкой :)


 
Андреевич   (2011-11-17 13:10) [29]


> delete кнопкой :)

значит ярлык останется и его можно будет удалить :)


 
Dennis I. Komarov ©   (2011-11-17 13:11) [30]


> еще как уместна, пользователь потому и пользователь, что
> не обязан всего знать, именно поэтому компьютер сейчас в
> доме встречается не реже микроволновки, потому что за пользователя
> думает производитель не обязывая первого перед эксплуатацией
> читать талмуды на 1000 листов.

Не путай пользователя с администратором или программистом, которые в твоей аналогии и должны менять задний мост уазика. Тут подходит "как ближний свет включить", а не мост чинить...

> как снес?

Ну вот так, взял и удалил твой EXE, ZIP чего там еще...


 
Dennis I. Komarov ©   (2011-11-17 13:12) [31]


> значит ярлык останется и его можно будет удалить :)

он не знает ничего о ярлыке, потому как его создал не он, а твоя мегасуперпрога...


 
Андреевич   (2011-11-17 13:18) [32]


> он не знает ничего о ярлыке, потому как его создал не он,
>  а твоя мегасуперпрога...

зато операционка знает и покажет в случае чего :)
какая разница как создан ярлык вручную или прогой, юзер что вспомнит что он его там делал? а через месяц? а через пять? :)


 
Dennis I. Komarov ©   (2011-11-17 13:26) [33]


> Андреевич   (17.11.11 13:18) [32]

Почему нет? В любом случае это его творение и он за это в ответе перед собой. И не надо переваливать свои грехи на операционку...


 
Anatoly Podgoretsky ©   (2011-11-17 14:03) [34]

> Dennis I. Komarov  (17.11.2011 12:05:17)  [17]

А то что теперь надо звать Пупкина


 
OW ©   (2011-11-17 14:11) [35]

ладно не Путина :)


 
Anatoly Podgoretsky ©   (2011-11-17 14:17) [36]

> Андреевич  (17.11.2011 12:48:20)  [20]

> конечно же нет, этот чекбокс добавляет прогу в автозагрузку. никаких тайн.

Это видимая часть

Ты бы сразу сказал что ленивый или что не знаешь.
Ленивым на данном месте не место.


 
Anatoly Podgoretsky ©   (2011-11-17 14:18) [37]

> Dennis I. Komarov  (17.11.2011 12:53:22)  [22]

Программ с такой функциональность ничтожно мало. Зачем дублировать
функциональность drag and drop


 
Anatoly Podgoretsky ©   (2011-11-17 14:19) [38]

> Андреевич  (17.11.2011 12:58:24)  [24]

"запускать со стартом системы",

Это не папка автозагрузки а именно  "запускать со стартом системы",


 
Anatoly Podgoretsky ©   (2011-11-17 14:21) [39]

> Dennis I. Komarov  (17.11.2011 12:59:25)  [25]

В его случае это может вообще не связано с папкой "Автозагрузка"
Возможно даже будет получать ошибку, мол не найдена "снесенная программа"


 
Anatoly Podgoretsky ©   (2011-11-17 14:22) [40]

> Андреевич  (17.11.2011 13:00:27)  [27]

Как как, да как обычно сносят пользователи, клавишей DELETE, ведь они ни
чего знать не должны, руководства читать тоже - это твои слова, или ты уже
отказываешься от них.


 
Anatoly Podgoretsky ©   (2011-11-17 14:23) [41]

> Андреевич  (17.11.2011 13:10:29)  [29]

Что удалить, пользователь не знает.


 
Anatoly Podgoretsky ©   (2011-11-17 14:24) [42]

> Dennis I. Komarov  (17.11.2011 13:11:30)  [30]

Особенно игры так часто сносят, delete и все


 
Dennis I. Komarov ©   (2011-11-17 14:43) [43]


> А то что теперь надо звать Пупкина

Если админ-права только у него, то да.


 
Андреевич   (2011-11-17 14:46) [44]


> Это видимая часть
>
> Ты бы сразу сказал что ленивый или что не знаешь.
> Ленивым на данном месте не место.

разумеется это честный чекбокс, и программа которой ты доверяешь. тем которым не доверяешь - не запускаешь, так ведь?


> Это не папка автозагрузки а именно  "запускать со стартом
> системы",

реализации могут быть разные


> Как как, да как обычно сносят пользователи

удивительно, но именно пользователи сносят через панель управления :)


> Что удалить, пользователь не знает.

ему подскажут


 
Dennis I. Komarov ©   (2011-11-17 14:49) [45]


> Программ с такой функциональность ничтожно мало. Зачем дублировать
> функциональность drag and drop

А я почем знаю, это не ко мне :)

> В его случае это может вообще не связано с папкой "Автозагрузка"
> Возможно даже будет получать ошибку, мол не найдена "снесенная
> программа"

В его как раз связано

> Особенно игры так часто сносят, delete и все

ССЗБ


 
Dennis I. Komarov ©   (2011-11-17 14:56) [46]


> Андреевич   (17.11.11 14:46) [44]

Самому еще не смешно, от детских отмазок?


 
Андреевич   (2011-11-17 15:15) [47]


> Dennis I. Komarov ©   (17.11.11 14:56) [46]

каких отмазок?


 
Dennis I. Komarov ©   (2011-11-17 15:16) [48]


> каких отмазок?

детских :)


 
Anatoly Podgoretsky ©   (2011-11-17 15:51) [49]

> Dennis I. Komarov  (17.11.2011 14:49:45)  [45]

Не ССЗБ, а ОСЗБ


 
Андреевич   (2011-11-17 16:14) [50]


> Dennis I. Komarov ©   (17.11.11 15:16) [48]

каких отмазок?


 
Dennis I. Komarov ©   (2011-11-17 16:26) [51]


> зато операционка знает и покажет в случае чего :)


> значит ярлык останется и его можно будет удалить :)


> реализации могут быть разные


> ему подскажут


 
Андреевич   (2011-11-17 17:09) [52]

и?



Страницы: 1 2 вся ветка

Текущий архив: 2012.02.26;
Скачать: CL | DM;

Наверх




Память: 0.61 MB
Время: 0.015 c
2-1320945193
Кирил_Антонович
2011-11-10 21:13
2012.02.26
Небольшая сетевая БД


2-1321131467
Laguna
2011-11-13 00:57
2012.02.26
Изменить курсор вне модальной формы


15-1319805286
Who_are_you
2011-10-28 16:34
2012.02.26
Защита, патент


15-1320735969
ищу хелп
2011-11-08 10:06
2012.02.26
А есть у кого хелп от Delphi 7?


2-1321558497
3asys
2011-11-17 23:34
2012.02.26
передача картинки в потоке через сокет