Форум: "Начинающим";
Текущий архив: 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