Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.01 c
1-94870
Lin
2003-05-20 10:14
2003.05.29
Из string в TStringList


1-94805
R
2003-05-19 09:46
2003.05.29
Два варианта подпрограмм


14-95022
vajo
2003-05-13 15:16
2003.05.29
Улучшение зрения. (эта ветка уже была)


1-94871
Vulko
2003-05-16 07:49
2003.05.29
Как перевести 10тиричное в 16ричное число...


1-94807
Renegate
2003-05-19 08:29
2003.05.29
Графика в RichEdit.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский