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

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

Автозагрузка проги в Windows XP sp3 [D2005, XP]


Страницы:   1 2 3

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]


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

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


Страницы:   1 2 3

Наверх

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