Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2008, 01:34   #1
Vi_russ
 
Регистрация: 02.12.2008
Сообщений: 4
По умолчанию Добавление в автозагрузку НЕ через реестр.

Нужно, чтобы программа по клику на CheckBox добавляла себя в автозагрузку и также по щелчку удалялась оттуда(НЕ через реестр).
(код для этого взял с http://pblog.ru/lab/?p=325 )


var
Folder: Pchar; //путь к StartUp
List: PitemidList; //список "специальных" папок

........

procedure TForm1.CheckBox16Click(Sender: TObject);
begin
if CheckBox16.Checked=true then begin
//ищем папку
SHGetSpecialFolderLocation(0,CSIDL_ STARTUP,List);
new(folder);
SHGetPathFromIDList(List,folder);
//Переходим в директорию StartUp
ChDir(folder);
//копируем файл
CopyFile(PChar(ExtractFilePath(para mStr(0)) + 'Q_S.exe'), 'Q_S.exe', true);
ShowMessage('Программа добавлена в автозагрузку!');
end
else begin
//ищем папку
SHGetSpecialFolderLocation(0,CSIDL_ STARTUP,list);
new(folder);
SHGetPathFromIDList(List,folder);
//Переходим в директорию StartUp
ChDir(folder);
//удаляем файл
DeleteFile('Q_S.exe');
ShowMessage('Программа удалена из автозагрузки!');
end;
end;

НО при удалении файла, файл не удаляется и появляется ошибка(вот скрин, если это чем то поможет)


если просто добавить в автозагрузку щелчком по CheckBox и закрыть прогу, то появляется такая же ошибка (или почти такая же).

Может нужно как то обнулять значения Folder: Pchar; и List: PitemidList; перед следующим использованием?
Подскажите кто что знает. Если можно добавить прогу в автозагрузку как то по другому или другими функциями, то сойдет, но только не через реестр!

Заранее спасибо.

Последний раз редактировалось Vi_russ; 07.12.2008 в 01:42.
Vi_russ вне форума Ответить с цитированием
Старый 07.12.2008, 09:18   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Я бы заменил Folder: PCHAR на
Код:
Folder: array[0..255] of Char;
...
FillChar(Folder, SizeOf(Folder), 0);
SHGetPathFromIDList(List, @Folder);
BOBAH13 вне форума Ответить с цитированием
Старый 07.12.2008, 19:00   #3
Vi_russ
 
Регистрация: 02.12.2008
Сообщений: 4
По умолчанию

Спасибо BOBAH13!
Все прекрасно работает, и он копирует в автозагрузку ЕХЕ-ФАЙЛ(!).
Т.к. программа после закрытия создает фаил конфига в директории запуска(!) то после запуска из автозагрузки,после закрытия прога создает там config.txt, что не желательно
Поэтому я сделал процедуру создания ярлыка и потом его то уже и копируем в автозагрузку. Кому понадобится, вот код:


uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ShlObj, ShellApi, ExtCtrls, Spin, ActiveX, ComObj;
//хз какие именно модули нужны для этих процедур скинул все

var
........
Folder: array[0..255] of Char; //путь к StartUp
List: PitemidList; //список "специальных" папок
dir:string; //путь к папке проги, из которой она запускается
........

procedure TForm1.FormCreate(Sender: TObject);
begin
dir:=extractfilepath(paramstr(0));
end;

//процедура создания ярлыка взято с http://pblog.ru/lab/?p=571
procedure CreateLink(const PathObj, PathLink, Desc, Param: string);
var
IObject: IUnknown;
SLink: IShellLink;
PFile: IPersistFile;
begin
IObject := CreateComObject(CLSID_ShellLink);
SLink := IObject as IShellLink;
PFile := IObject as IPersistFile;
with SLink do
begin
SetArguments(PChar(Param));
SetDescription(PChar(Desc));
SetPath(PChar(PathObj));
end;
PFile.Save(PWChar(WideString(PathLi nk)), FALSE);
end;

{в моей проге добавление в автозагрузку производится по щелчку по CheckBox}
procedure TForm1.CheckBox16Click(Sender: TObject);
begin
if CheckBox16.Checked=true then begin
//создаем ярлык
CreateLink(dir+'\Q_S.exe',dir+'\Qui ck Start.lnk','','');
//ищем папку StartUp
SHGetSpecialFolderLocation(0,CSIDL_ STARTUP,List);
FillChar(Folder, SizeOf(Folder), 0);
SHGetPathFromIDList(List, @Folder);
//Переходим в директорию StartUp
ChDir(folder);
//копируем файл
CopyFile(PChar(ExtractFilePath(para mStr(0)) + 'Quick Start.lnk'), 'Quick Start.lnk', true);
ShowMessage('Программа добавлена в автозагрузку!');
//удаляем ярлык из папки программы, т.к. он там остался
DeleteFile(ExtractFilePath(paramStr (0)) + 'Quick Start.lnk');
end
else begin
//ищем папку StartUp
SHGetSpecialFolderLocation(0,CSIDL_ STARTUP,list);
FillChar(Folder, SizeOf(Folder), 0);
SHGetPathFromIDList(List, @Folder);
//Переходим в директорию StartUp
ChDir(folder);
//удаляем файл
DeleteFile('Quick Start.lnk');
ShowMessage('Программа удалена из автозагрузки!');
end;
end;

{
пояснения:
Q_S.exe -ваша прога
Quick Start.lnk -ярлык для вашей проги
}

Последний раз редактировалось Vi_russ; 08.12.2008 в 11:58.
Vi_russ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Настройка Windows через реестр GAGARIN-NEW Windows 9 13.07.2009 14:30
Получить доступ к скринсейверу через реестр Vask Общие вопросы Delphi 1 24.09.2008 21:12
добавление программы в автозагрузку MAKEDON Общие вопросы Delphi 6 22.07.2008 14:30
Определить модель монитора (не через реестр!) oleg kutkov Общие вопросы Delphi 1 06.12.2007 01:31
Как программно назначить привилегию или писать в реестр через WinApi ? UnD)eaD)Snake Win Api 16 27.09.2007 20:20