![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Автозагрузка проги в Windows XP sp3 [D2005, XP]
Aleks © (2011-11-16 14:09:00)Написал прогу напоминалку. Хочу чтобы пользователь мог добавить ее в автозагрузку при желании. Использую вариант с внесением в папку "Автозагрузка" ОС(лучше варианта с реестром,так-как в Виндовс 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. Если вручную перетянуть пусковой файл на Пуск-Автозагрузка и перегрузить ПК,то программа запускается без ошибок. Ручной запуск происходит тоже без ошибок. Видимо собака зарыта в процедуре внесения в автозагрузку,но где не понятно :(
Dennis I. Komarov (2011-11-17 09:07:00) [41]
> ему удобнее когда это делается нажатием одной кнопки в программе
баловство, порождающее проблемы...
antonn (2011-11-17 02:24:00) [42]
> Или ему эта ноша не под силу?
ему удобнее когда это делается нажатием одной кнопки в программе
Dennis I. Komarov (2011-11-17 00:27:00) [43]Зачем делать ярлык программно, если это прерогатива пользователя? Или ему эта ноша не под силу? Если инстал - в реестр, если пользователь - сам его проблемы, что закинуть в "Автозагрузку".
Aleks (2011-11-16 22:30:00) [44]Компилил в 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');
Все заработало! :)
Омлет (2011-11-16 21:07:00) [45]
> Aleks (16.11.11 17:29) [7]
> Приведенный тобою код работает,но создает почему-то пустой
> ярлык
хз.. XPSP3+D7 - всё работает.
Aleks (2011-11-16 17:29:00) [46]>Омлет Приведенный тобою код работает,но создает почему-то пустой ярлык
без указания имени файла и рабочей директории,вызываю так: addAutoRun(Application.ExeName, 'MyProgram')
Aleks (2011-11-16 17:03:00) [47]Спасибо Большое всем за ценные советы! Буду пробовать...
Омлет (2011-11-16 15:29:00) [48]
> 2. Зачем создавать ярлык в одном месте, потом копировать
> в другое и удалять в первом...
Тем более, что прав на создание файлов в папке программы может не быть.
И вообще, этот ярлык должен создавать инсталлятор.
Омлет (2011-11-16 15:13:00) [49]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. Учись пользоваться яндексом.
Aleks (2011-11-16 14:38:00) [50]А как при внесении в автозагрузку указать в свойствах ярлыка рабочую папку программы?
clickmaker (2011-11-16 14:27:00) [51]> " is not valid integer value
ищи, где StrToInt используется или что-то типа
Андреевич (2011-11-16 14:15:00) [52]
> Видимо собака зарыта в процедуре внесения в автозагрузку,
> но где не понятно :(
или не указана рабочая директория программы в параметрах ярлыка, а программа была написана без учета этого варианта. соответственно ошибка не в процедуре внесения в автозагрузку, а в проге в другом месте