Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Как подружить и ...


Автор: navodri 5.12.2010, 18:17
Мне нужно создать ярлык к программе с иконкой оптического привода, а не программы.  Как известно, ExtractAssociatedIcon возвращает хендл иконки. А в конструкции MySLink.SetIconLocation нужно указывать путь к иконке. Вопрос: как подружить MySLink.SetIconLocation и ExtractAssociatedIcon ?


Код

uses
  ...ShlObj, ActiveX, ComObj, ShellApi;

function GetAssociatedIcon(FileName: String; IconIndex: Word): hIcon;
begin
 Result := ExtractAssociatedIcon(HInstance, PChar(FileName), IconIndex);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 MyObject: IUnknown;
 MySLink: IShellLink;
 MyPFile: IPersistFile;
 WFileName: WideString;
 IconIndex: Word;
 icon: hIcon;
begin
   MyObject := CreateComObject(CLSID_ShellLink);
   MySLink := MyObject as IShellLink;
   MyPFile := MyObject as IPersistFile;
    with MySLink do begin
     SetPath(PChar(ParamStr(0)));
     SetArguments('params');
     SetWorkingDirectory(PChar(ExtractFilePath(ParamStr(0))));

     //Вытянул иконку своего оптического привода (E:\)...
     icon := GetAssociatedIcon(PChar('E:\'), IconIndex);

     //...а теперь, как ее назначить ярлыку, ведь SetIconLocation требует путь к иконке, а не хендл?
     SetIconLocation('путь к иконке', 0);

    end;
   WFileName := ParamStr(0) + '.lnk';
   MyPFile.Save(PWChar(WFileName), False);
end;

Автор: Keeper89 5.12.2010, 18:41
А разве автоматически иконка нужной не будет (без указания SetIconLocation)?

Автор: navodri 5.12.2010, 19:14
2Keeper89. 
Как видно по коду, ярлык создается к своей программе, а иконку нужно стянуть с оптического привода.

Автор: Keeper89 5.12.2010, 20:14
А, ну тогда есть функция GetIconLocation с флагом SHGFI_ICONLOCATION.

Автор: navodri 5.12.2010, 20:34
Невижу никакого смысла в ее применении/ Она возвращает Integer. А мне для SetIconLocation('путь к иконке', 0) нужен Pchar (путь к иконке).

Автор: Keeper89 5.12.2010, 22:20
Цитата(navodri @  5.12.2010,  20:34 Найти цитируемый пост)
Она возвращает Integer

Путь и индекс:

http://msdn.microsoft.com/en-us/library/bb761852%28VS.85%29.aspx

Автор: navodri 5.12.2010, 23:03
Решено! Спасибо за участие! Рабочий код:

Код

procedure TForm1.Button1Click(Sender: TObject);
var
 MyObject: IUnknown;
 MySLink: IShellLink;
 MyPFile: IPersistFile;
 WFileName: WideString;
 ShInfo: TSHFileInfo;
begin
   MyObject := CreateComObject(CLSID_ShellLink);
   MySLink := MyObject as IShellLink;
   MyPFile := MyObject as IPersistFile;
    with MySLink do begin
     SetPath(PChar(ParamStr(0)));
     SetArguments('params');
     SetWorkingDirectory(PChar(ExtractFilePath(ParamStr(0))));
     SHGetFileInfo(PChar('E:\'), 0, ShInfo, SizeOf(ShInfo), SHGFI_ICONLOCATION);
     SetIconLocation(ShInfo.szDisplayName, ShInfo.iIcon);
    end;
   WFileName := ParamStr(0) + '.lnk';
   MyPFile.Save(PWChar(WFileName), False);
end;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)