Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.02.26;
Скачать: [xml.tar.bz2];

Вниз

Автозагрузка проги в 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, ведь они ни
чего знать не должны, руководства читать тоже - это твои слова, или ты уже
отказываешься от них.



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

Форум: "Начинающим";
Текущий архив: 2012.02.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.004 c
15-1320674537
mvconf
2011-11-07 17:02
2012.02.26
Разработка системы видеоконференцсвязи


15-1320695289
_qwerty_
2011-11-07 22:48
2012.02.26
что подразумевается под клиентским по сетей microsoft?


2-1321864635
megagenom
2011-11-21 12:37
2012.02.26
Мониторинг свободного пространства на удаленном сервере.


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


2-1321861435
pavor
2011-11-21 11:43
2012.02.26
Чтение атрибутов из файла XML





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский