Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.29;
Скачать: CL | DM;

Вниз

Ярлык с другой иконкой из ресурсов программы?   Найти похожие ветки 

 
lipskiy ©   (2003-05-11 23:24) [0]

Есть проблема - нужно создать ярлык на исполняемый файл, но иконку этого ярлыка взять не основную, а другую, из ресурсов.

Суть вот в чем. Один ехешник может быть запущен с разными параметрами и в зависимости от этого работать как несколько разные программы. Для каждого варианта нужно создать ярлык, запускающий один и тот же ехешник, но с разными параметрами. Чтобы юзер их отличал, иконки этим ярлыкам нужно задать разные. Ехешник инсталлирует сам себя и создает два ярлыка на самого себя. Первому ярлыку задается основная иконка, а вот второму нужно задать другую иконку, которая включена в ресурсы. Не получается это сделать.

Вот что я делаю.
Вначале Project/Options/Application/Load Icon - это основная иконка.
Затем Project/Resources/New Icon - добавляю вторую иконку.
Здесь сразу первая проблема - в качестве основной после компиляции ставновится почему-то вторая иконка. Приходится менять их местами.
Далее в программе я создаю два ярлыка с помощью следующей процедуры:

procedure CreateShortcut(const FilePath, ShortcutPath, WorkDir, Description, Params:string; IconIndex:integer);
var obj: IUnknown;
isl: IShellLink;
ipf: IPersistFile;
begin
obj := CreateComObject(CLSID_ShellLink);
isl := obj as IShellLink;
ipf := obj as IPersistFile;
with isl do
begin
SetPath(PChar(FilePath));
SetArguments(PChar(Params));
SetDescription(PChar(Description));
SetWorkingDirectory(PChar(WorkDir));
SetIconLocation(PChar(FilePath),IconIndex);
end;
ipf.Save(PWChar(WideString(ShortcutPath)), False);
end;


Делаю два вызова этой процедуры:

CreateShortcut(Application.ExeName, "Путь к ярлыку\Имя ярлыка 1.lnk", ExtractFileDir(Application.ExeName), "", "param0",0);
CreateShortcut(Application.ExeName, "Путь к ярлыку\Имя ярлыка 2.lnk", ExtractFileDir(Application.ExeName), "", "param1",1);


По моему разумению номер иконки IconIndex 0 и 1 указывает на номер иконки в ресурсах. Но если для номера 0 я получаю последнюю иконку в списке иконок в ресурсах, то для номера 1 я вообще не получаю иконки - создается дефолтная виндовская белая иконка.

Что тут не правильно и как это решается?


 
lipskiy ©   (2003-05-12 11:04) [1]

Ну плиииз!


 
Cobalt ©   (2003-05-12 15:46) [2]

Попробуй проверь, какие на самом деле у тебя хранятся иконки, и какие у них индексы. Скажем, в реестре пропиши для типа файлов(через проводник) эту икноку, и посмотри - какие у них индексы.


 
lipskiy ©   (2003-05-12 21:45) [3]

Если я делаю ярлык на этот файл, то проводник в окне "Сменить значок" показывает мне две иконки (по вертикали), а как у них индексы проверить? И почему они могут быть не по порядку?


 
lipskiy ©   (2003-05-14 20:58) [4]

Ну плиииз!


 
Fenik ©   (2003-05-14 22:42) [5]

Из Тейксейры и Пачеко (может поможет?):

unit WinShell;

interface

uses ... , ActiveX, ShlObj, ComObj;

type
EShellOleError = class(Exception);

TShellLinkInfo = record
PathName: string;
Arguments: string;
Description: string;
WorkingDirectory: string;
IconLocation: string;
IconIndex: integer;
ShowCmd: integer;
HotKey: word;
end;

function CreateShellLink(const AppName, Desc: string; Dest: Integer): string;
{ Creates a shell link for application or document specified in }
{ AppName with description Desc. Link will be located in folder }
{ specified by Dest, which is one of the string constants shown }
{ at the top of this unit. Returns the full path name of the }
{ link file. }
var
SL: IShellLink;
PF: IPersistFile;
LnkName: WideString;
begin
OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER,
IShellLink, SL));
{ The IShellLink implementer must also support the IPersistFile }
{ interface. Get an interface pointer to it. }
PF := SL as IPersistFile;
OleCheck(SL.SetPath(PChar(AppName))); // set link path to proper file
if Desc <> "" then
OleCheck(SL.SetDescription(PChar(Desc))); // set description
{ create a path location and filename for link file }
LnkName := GetSpecialFolderPath(Dest, True) + "\" +
ChangeFileExt(AppName, "lnk");
PF.Save(PWideChar(LnkName), True); // save link file
Result := LnkName;
end;

procedure GetShellLinkInfo(const LinkFile: WideString; var SLI: TShellLinkInfo);
{ Retrieves information on an existing shell link }
var
SL: IShellLink;
PF: IPersistFile;
FindData: TWin32FindData;
AStr: array[0..MAX_PATH] of char;
begin
OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER,
IShellLink, SL));
{ The IShellLink implementer must also support the IPersistFile }
{ interface. Get an interface pointer to it. }
PF := SL as IPersistFile;
{ Load file into IPersistFile object }
OleCheck(PF.Load(PWideChar(LinkFile), STGM_READ));
{ Resolve the link by calling the Resolve interface function. }
OleCheck(SL.Resolve(0, SLR_ANY_MATCH or SLR_NO_UI));
{ Get all the info! }
with SLI do
begin
OleCheck(SL.GetPath(AStr, MAX_PATH, FindData, SLGP_SHORTPATH));
PathName := AStr;
OleCheck(SL.GetArguments(AStr, MAX_PATH));
Arguments := AStr;
OleCheck(SL.GetDescription(AStr, MAX_PATH));
Description := AStr;
OleCheck(SL.GetWorkingDirectory(AStr, MAX_PATH));
WorkingDirectory := AStr;
OleCheck(SL.GetIconLocation(AStr, MAX_PATH, IconIndex));
IconLocation := AStr;
OleCheck(SL.GetShowCmd(ShowCmd));
OleCheck(SL.GetHotKey(HotKey));
end;
end;

procedure SetShellLinkInfo(const LinkFile: WideString; const SLI: TShellLinkInfo);
{ Sets information for an existing shell link }
var
SL: IShellLink;
PF: IPersistFile;
begin
OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER,
IShellLink, SL));
{ The IShellLink implementer must also support the IPersistFile }
{ interface. Get an interface pointer to it. }
PF := SL as IPersistFile;
{ Load file into IPersistFile object }
OleCheck(PF.Load(PWideChar(LinkFile), STGM_SHARE_DENY_WRITE));
{ Resolve the link by calling the Resolve interface function. }
OleCheck(SL.Resolve(0, SLR_ANY_MATCH or SLR_UPDATE or SLR_NO_UI));
{ Set all the info! }
with SLI, SL do
begin
OleCheck(SetPath(PChar(PathName)));
OleCheck(SetArguments(PChar(Arguments)));
OleCheck(SetDescription(PChar(Description)));
OleCheck(SetWorkingDirectory(PChar(WorkingDirectory)));
OleCheck(SetIconLocation(PChar(IconLocation), IconIndex));
OleCheck(SetShowCmd(ShowCmd));
OleCheck(SetHotKey(HotKey));
end;
PF.Save(PWideChar(LinkFile), True); // save file
end;

end.


 
lipskiy ©   (2003-05-18 01:21) [6]

Пока не помогло.
Работает точно так же.
То есть не правильно получается, и выглядит именно так же, как и в моем варианте.

Может я неверно вношу вторую иконку в ресурсы? Через Project/Resources делаю, может так оно неправильно или криво и можно как-то иначе?



Страницы: 1 вся ветка

Текущий архив: 2003.05.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
3-94745
Alex_t
2003-05-10 21:44
2003.05.29
что за расширение gbk для базы данных


3-94660
P.Kert
2003-05-07 10:58
2003.05.29
Необходимо вставить BLOB !!!


14-95029
Vlad Oshin
2003-05-13 14:37
2003.05.29
теоретический вопрос про раскладку клавы. Переключение.


1-94925
BorisKB
2003-05-16 12:26
2003.05.29
Нужен элегантный алгоритм. Работа с датами.


3-94684
AlexA
2003-05-06 14:50
2003.05.29
Как определить коордираты текущей ячейки у DBGrid a?