Форум: "Основная";
Текущий архив: 2003.05.29;
Скачать: [xml.tar.bz2];
ВнизЯрлык с другой иконкой из ресурсов программы? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c