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

Вниз

Как создать ярлык ?   Найти похожие ветки 

 
Winni   (2010-01-21 06:29) [0]

Здравствуйте !

Пытаюсь создать программу для инсталляции. Естественно, нужно, чтобы она размещала на раб.столе пользователя (и хорошо бы - в меню программ) ярлык, указывающий на экзешник. Install Shield с диска Делфи7 прекрасно это делает, но нужен самодельный инсталлятор.  То есть нужно создать ярлык, задать адрес и задать иконку. Далее вроде бы,  могу поместить ее в ресурс, а при инсталляции - извлечь.


 
oldman ©   (2010-01-21 11:41) [1]


> То есть нужно создать ярлык, задать адрес и задать иконку.
>  Далее вроде бы,  могу поместить ее в ресурс, а при инсталляции
> - извлечь.


Ну так и создай. Руками. И в ресурс помести.
Но будет жестко привязана к адресу.
Значит создай, посмотри, где пишется адрес, и при инсталляции меняй его.


 
Anatoly Podgoretsky ©   (2010-01-21 11:55) [2]

Вот и используй Install Shield, оно много чего делает и делает правильно.


 
В. Молчанов   (2010-01-21 14:44) [3]

Создать ярлык:

function MakeShortcut(const sFName, sLnk, sWorkDir, sArgs, sIconFile: string;
                     IconIndex: integer): boolean;
var CO: IUnknown;
begin
 Result := False;
 CO := CreateComObject(CLSID_ShellLink);
 try
   with IShellLink(CO) do
   begin
     if SetPath(PChar(sFName)) <> S_OK then exit;
     if sIconFile <> "" then
       if SetIconLocation(PChar(sIconFile), IconIndex) <> S_OK then exit;
     if SetArguments(PChar(sArgs)) <> S_OK then exit;
     if SetWorkingDirectory(PChar(sWorkDir)) <> S_OK then exit;
   end;
   Result := Succeeded((CO as IPersistFile).Save(PWChar(WideString(sLnk)), False))
 finally
   CO := Unassigned
 end
end;

Получить путь для ярлыка:

// S = "" -> Desktop folder
function GetFullMenuPath(const S: string): string;
var PIDL: PItemIDList;
   TempPath: array[0..MAX_PATH] of Char;
   Dir: integer;
begin
 Result := "";
 if S = "" then Dir := CSIDL_DESKTOPDIRECTORY
           else Dir := CSIDL_COMMON_PROGRAMS;

 SHGetSpecialFolderLocation(Application.Handle, Dir, PIDL);
 if PIDL <> nil then
 begin
   SHGetPathFromIDList(PIDL, TempPath);
   Result := string(TempPath) + "\";
   GlobalFreePtr(PIDL)
 end
end;

Вызов:

 MakeShortcut(ParamStr(0),
              GetFullMenuPath("")+"\Qwerty1.lnk",
              ExtractFileDir(ParamStr(0)),
              "/H",
              ExtractFilePath(ParamStr(0)) + "FileWithIcon.exe",  // ""
              0
              )


 
Winni   (2010-01-21 16:51) [4]

Спасибо большое !


 
Winni   (2010-01-21 20:04) [5]

Здравствуйте !

Действительно, все это прекрасно работает. Возможно, кому-нибудь пригодятся мои комментарии:
(* Разборка (комментарии):
Необходимо добавит в uses: ShlObj, ComOBJ, ActiveX

CLSID_ShellLink - описана в ShlObj.pas :
 {$EXTERNALSYM CLSID_ShellLink}
 CLSID_ShellLink: TGUID = (
   D1:$00021401; D2:$0000; D3:$0000; D4:($C0,$00,$00,$00,$00,$00,$00,$46));
----------
IShellLink - интерфейс описан в ShlObj.pas
SetPath - описан в ShlObj.pas:
   function SetPath(pszFile: PAnsiChar): HResult; stdcall;
----------
SetIconLocation - описана в ShlObj.pas
function SetIconLocation(pszIconPath: PAnsiChar; iIcon: Integer):
  HResult; stdcall;
----------
SetArguments - описана в ShlObj.pas
function SetArguments(pszArgs: PAnsiChar): HResult; stdcall;
--------
SetWorkingDirectory - описана в ShlObj.pas
function SetWorkingDirectory(pszDir: PAnsiChar): HResult; stdcall;
---------
Succeeded - описана в Windows.pas
{$EXTERNALSYM Succeeded}
function Succeeded(Status: HRESULT): BOOL;
----------
IPersistFile  - интерфейс описан в ActiveX.pas
{ IPersistFile interface }
 {$EXTERNALSYM IPersistFile}
 IPersistFile = interface(IPersist)
   ["{0000010B-0000-0000-C000-000000000046}"]
   function IsDirty: HResult; stdcall;
   function Load(pszFileName: POleStr; dwMode: Longint): HResult;stdcall;
   function Save(pszFileName: POleStr; fRemember: BOOL): HResult;stdcall;
   function SaveCompleted(pszFileName: POleStr): HResult;stdcall;
   function GetCurFile(out pszFileName: POleStr): HResult;stdcall;
 end;
*)

Вызов функции немного изменил, чтобы создавать ярлык для инсталлированной программы, а не для
инсталлятора:
MakeShortcut(papka+"\TXTPLAYER.EXE",
   GetFullMenuPath("")+"\TXTPLAYER.lnk", // Если ярлык - на рабочий стол
   papka,
   "/H",
   papka+"\TXTPLAYER.EXE",
   0);
где papka - строка, хранящая имя папки, в которую инсталлирована программа
(ярлык создается позже копирования файлов в эту папку),
TXTPLAYER.EXE - имя инсталлируемой программы.
TXTPLAYER.lnk - имя ярлыка, создаваемого на рабочем столе.


 
clickmaker ©   (2010-01-22 13:44) [6]

> TXTPLAYER

проигрыватель текстов? типа аудиокнига голосом робота?
просто интересно...


 
Winni   (2010-01-23 18:26) [7]

Не, просто переформатирует файлы *.txt так, чтобы при просмотре в mp3-плеере (например, Kingston KPEX-100) сохранялся перенос на новую строку. Мне кажется, это удобнее, а я много читаю в KPEX-100 - чтобы не сидеть за компом, а читать мануалы лежа на диване.
В моих комментариях дефект: не указал, что
.SetPath -
.SetIconLocation -
.SetArguments -
.SetWorkingDirectory
- это методы интерфейса IShellLink



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

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

Наверх




Память: 0.49 MB
Время: 0.199 c
2-1346416774
Bolg
2012-08-31 16:39
2013.03.22
На что указывает указатель?


15-1352731709
Kerk
2012-11-12 18:48
2013.03.22
Всякие полезные услуги в социальных сетях


2-1342945485
Ярослав
2012-07-22 12:24
2013.03.22
Склейка формы


15-1337286603
Юрий
2012-05-18 00:30
2013.03.22
С днем рождения ! 18 мая 2012 пятница


1-1298124684
Wadimka
2011-02-19 17:11
2013.03.22
Наложение Bitmap