![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Add to AutoRun [D7, WinXP]
Goorus © (2004-08-27 13:09:00)Необходимо добавить ярлык в атозагрзку. В самой программе это получилось, но по завершении выдавалась ошибка. Думал это связано с неосвобождением объектов, но у интерфейсов нет метода Free, а _Release не помогал.
Попробывал написать простую демку(форма с кнопкой), работать стало ещё хуже :) Демка даже не добавляет себя в автозагрузку, хотя код не изменялся. Причина: в переменную Folder передаётся неверный путь ("С:\Docum^ "). Вот код:
procedure TForm1.Button1Click(Sender: TObject);
var List:PItemIdList;
SLink:IShellLink;
Folder:PChar;
begin
// создаём ярлык в автозагрузке
// находим папку
SHGetSpecialFolderLocation(0, CSIDL_STARTUP, List);
New(Folder);
SHGetPathFromIDList(List, Folder);
ShowMessage(Folder); // <- неверный путь
// прописываемся
SLink:=IShellLink(CreateComObject(CLSID_ShellLink));
SLink.SetArguments('/a');
SLink.SetDescription('My Prog');
SLink.SetPath( PChar(ParamStr(0)) );
(SLink as IPersistFile).Save(PWChar(WideString(Folder+'\prog.lnk')), False);
end;
Экспериментатор (2004-08-28 14:58:00) [1]Например, так
ну примерно так (Вызываешь в программе функцию SetAutoRun(True) и все дела)
var
Ga_RegKey : string = 'Имя программы';
function IsNT : boolean;
begin
case Win32Platform of
VER_PLATFORM_WIN32_NT: Result:=True;
else Result:=False;
end;
end;
procedure SetAutoRun( isCreate : boolean);
var Reg: TRegistry;
begin
Reg := TRegistry.Create;
try
if isNT then Reg.RootKey := HKEY_CURRENT_USER
else Reg.RootKey := HKEY_LOCAL_MACHINE;
if isCreate then
begin
if Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', False) then
begin
if Reg.ReadString(Ga_RegKey)<>ParamStr(0) then
begin
if(Application.MessageBox(
'Добавить '+Ga_RegKey+' в автозагрузку?',
'Добавление в автозагрузку',MB_ICONQUESTION + MB_YesNO + MB_DEFBUTTON2) = IDYES) then
try
Reg.WriteString(Ga_RegKey,ParamStr(0));
Application.MessageBox(Ga_RegKey+' успешно добавлена в автозагрузку!',
'Автозагрузка',MB_ICONINFORMATION + MB_OK);
except
Application.MessageBox(
'Ошибка изменения реестра. Нет доступа!',
'Автозагрузка',MB_ICONERROR + MB_OK);
end
end else Application.MessageBox(
Ga_RegKey+' уже добавлена в автозагрузку!',
'Автозагрузка',MB_ICONWARNING + MB_OK);
end;
end else
begin
if (Application.MessageBox('Вы действительно хотите убрать '+Ga_RegKey+' из автозагрузки?',
'Удаление из автозагрузки', MB_ICONQUESTION + MB_YesNO + MB_DEFBUTTON2) = IDYES)
and Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', False)
and Reg.ValueExists(Ga_RegKey) then
if Reg.DeleteValue(Ga_RegKey) then
Application.MessageBox(
Ga_RegKey+' успешно удалена из автозагрузки!',
'Автозагрузка',MB_ICONINFORMATION + MB_OK)
else
Application.MessageBox(
Ga_RegKey+' не удалена из автозагрузки!'+
^M+'Нет доступа!',
'Автозагрузка',MB_ICONSTOP + MB_OK);
end;
finally
Reg.CloseKey;
Reg.Free;
end;
end;
Sanek_metaller (2004-08-27 21:22:00) [2]А через реестр не легче?
GrayFace (2004-08-27 19:48:00) [3]Удалено модератором
DiamondShark (2004-08-27 16:31:00) [4]
> VMcL © (27.08.04 16:11) [28]
А я написал в [26].
Конечно, не видя описания catList -- это гадание на кофейной гуще. Но всё же, что-то мне подсказывает, что это просто TList, иначе, от чего же управление итемами не вынесено в него, а стоит сторонний цикл?
Да не в том дело, типизирован там Items или нет. Этот фрагмент был приведён в качестве образца как надо обращаться с интерфейсами. И не в кассу -- что закономерно, ибо как раз с интерфейсами там ситуация шибко нестандартная.
VMcL (2004-08-27 16:28:00) [5]>> jack128 © (27.08.04 16:21) [29]
И верно нет. Тады ой, судя поACategory^.FriendlyName := Name;
jack128 (2004-08-27 16:21:00) [6]VMcL © (27.08.04 16:11) [28]
Если правильно типизироватьпараметр Dispose
в коде правильной типизации нет.
VMcL (2004-08-27 16:11:00) [7]>> DiamondShark © (27.08.04 15:54) [25]
Насчет Dispose ты неправ. Если правильно типизировать параметр Dispose, то всё прекрасно финализируется. Можешь проверить по хелпу о Finalize.
jack128 (2004-08-27 16:04:00) [8]DiamondShark © (27.08.04 15:54) [25]
> Но запись не будет финализирована
наследник может Notify перекрыть и там файнализировать. очень маловероятно и идеологически не верно, но возможно..
DiamondShark (2004-08-27 16:03:00) [9]
> DiamondShark © (27.08.04 15:54) [25]
Впрочем, если это таки наследник, и свойство переопределено как типизированное (а не Pointer):
property Items[Index: integer]: PТрамПамПам;
то всё, конечно же, будет финализировано.
DiamondShark (2004-08-27 15:54:00) [10]
> конечно с утечкой памяти возможны варианты (если CatList
> - реально не TList, а его наследник),
Не... Там итемы удаляются Dispose (самый первый for).
Конечно, саму запись Dispose удалит корректно, менеджер памяти с размерами разберётся. Но запись не будет финализирована. И если в ней есть управляемые поля (длинные строки, в частности), то они повиснут.
Danilka (2004-08-27 15:52:00) [11][23] DiamondShark © (27.08.04 15:48)
Тем не менее, это не повод переходить к оскорблениям. Ты и без них все объяснил, зачем заходить так далеко?
С.м. 8-й пункт правил поведения на форуме.
DiamondShark (2004-08-27 15:48:00) [12]
> WondeRu © (27.08.04 15:31) [19]
Ты взялся советовать. Причём, советовать а) не в кассу б) обладая представлениями, основанными не на понимании, а на обезьянском подражании тому, что тебе удалось где-то подсмотреть.
Первый намёк тебе на это был весьма сдержанный.
jack128 (2004-08-27 15:36:00) [13]WondeRu © (27.08.04 15:23) [16]
но "Компилятор сам следит" ;-)
Ну так он же компилятор , а не искуственный интеллект (с) почти ЮЗ
> а чего скажешь насчет 12-го поста?
DS все расписал. конечно с утечкой памяти возможны варианты (если CatList - реально не TList, а его наследник), но это маловероятно..
WondeRu (2004-08-27 15:35:00) [14]Удалено модератором
VMcL (2004-08-27 15:33:00) [15]> DiamondShark
Эта... полегче с выражениями.
WondeRu (2004-08-27 15:31:00) [16][15]
как лягушку припарировал )
DiamondShark © (27.08.04 15:22) [15]
Так что удавись, ламерок.
эээхх! вроде взрослый человек, а ведет себя как ребенок!(
"Вам бы лечиться" © ;-)
Goorus (2004-08-27 15:30:00) [17]> Skier
Этот пример я взял за основу
New(Folder) - это тоже я взял из примера в ФАКе, и что самое удивительно к определённых случаях это работает :)
SLink:=nil;
Не помогало, уже пробывал. А реестр штука ненадёжная, а меню автозагрузки для того и существует, оттуда пользователю легче программы выкидывать :)
Всем спасибо!
Folder:array[0..1000] of Char; // гениально !!! ;)
DiamondShark (2004-08-27 15:27:00) [18]Удалено модератором
WondeRu (2004-08-27 15:23:00) [19]jack128 © (27.08.04 15:17) [14]
это и ежу понятно! но "Компилятор сам следит" ;-)
а чего скажешь насчет 12-го поста?
----
понимаю что выхожу в оффтоп, но охота разобраться че к чему
DiamondShark (2004-08-27 15:22:00) [20]Удалено модератором