Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Dodakaedr, ото ж .

Давайте попробуем так: сначала прикрепляем ярлык на Панель задач, затем добавляем к нему аргумент.

Добавьте в секцию [code] скрипта инсталляции следующий код:
Скрытый текст
Код: Выделить весь код
//the function is work well on Unicode Inno Setup, 
//if Non Unicode Inno Setup, one need to modify,
//and I think you can do it!
//Inno use Win32 API
const
  // these constants are not defined in Windows
  SHELL32_STRING_ID_PIN_TO_TASKBAR = 5386;
  SHELL32_STRING_ID_PIN_TO_STARTMENU = 5381;
  SHELL32_STRING_ID_UNPIN_FROM_TASKBAR = 5387;
  SHELL32_STRING_ID_UNPIN_FROM_STARTMENU = 5382;

  sFileName = 'Program.exe';

#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif
function LoadLibrary(lpFilename : String) : LongInt;
external 'LoadLibrary{#A}@kernel32.dll stdcall delayload';  //if Non Unicode Inno Setup, use LoadLibraryA
function FreeLibrary(hModule : LongInt) : BOOL;
external 'FreeLibrary@kernel32.dll stdcall delayload';
function LoadString(hInstance:LongInt; uId:UINT; lpBuffer:String; nBufferMax:Integer) : Integer;
external 'LoadString{#A}@user32.dll stdcall delayload';  //if Non Unicode Inno Setup, use LoadStringA

//here is the function
//@param strPath The App's directory,
//@param strApp The App's name
//@example zylPinAppToTaskbar('c:\window', 'notepad.exe');
procedure zylPinAppToTaskbar(strPath, strApp: string);  
var  
  vShell, vFolder, vFolderItem, vItemVerbs: Variant;  
  vPinnedShortcutFileName: Variant;
  vWshShell, vShellLink: Variant;
  vPath, vApp: Variant;  
  i: Integer;  
  sItem: String;   
  h: LongInt; 
  szPinName: String; 
  filenameEnd : Integer;
  filename    : String; 
  strEnd    : String;
begin 
  SetLength(szPinName, 255); 
  h := LoadLibrary(ExpandConstant('{sys}\Shell32.dll'));  
  LoadString(h, SHELL32_STRING_ID_PIN_TO_TASKBAR, szPinName, 255); //pin to taskbar text 
  FreeLibrary(h);  
  strEnd := #0;
  filenameEnd := Pos(strEnd, szPinName);
  filename := Copy(szPinName, 1, filenameEnd - 1);
  if (Length(filename) > 0) then  //WinXp or lower, no pin taskbar function
  begin
    vShell := CreateOleObject('Shell.Application');  
    vPath := strPath;  
    vFolder := vShell.NameSpace(vPath);  
    vApp := strApp;  
    vFolderItem := vFolder.ParseName(vApp);  
    vItemVerbs := vFolderItem.Verbs;  
    for i := 1 to vItemVerbs.Count do  
    begin  
      sItem := vItemVerbs.Item(i).Name;
      if (sItem = filename) then
      begin
        // 63 63 72 75 6E 2E 63 6F 6D  
        vItemVerbs.Item(i).DoIt;
        vPinnedShortcutFileName := vShell.NameSpace('shell:User Pinned').self.Path + '\TaskBar\' + vFolder.GetDetailsOf(vFolderItem, 34) + '.lnk';
        if (FileExists(vPinnedShortcutFileName)) then
        begin
          vWshShell := CreateOleObject('Wscript.Shell');
          vShellLink := vWshShell.CreateShortcut(vPinnedShortcutFileName);
          vShellLink.Arguments := '/Rem';
          vShellLink.Save();
        end;
        break; 
      end; 
    end;
  end;
end;  

//You can use zylPinAppToTaskbar like this
procedure CurPageChanged(CurPageID: Integer);
begin
  //When Finished page is shown, call the function
  //You can also call is when the "Finish" button clicked.
  if  CurPageID = wpFinished then  
  begin
  if IsTaskSelected('pintaskbar') then
    zylPinAppToTaskbar(ExpandConstant('{app}'), sFileName);
  end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
  vShell, vFolder, vFolderItem: Variant;  
  vPinnedShortcutFileName: Variant;
begin
  if CurUninstallStep = usUninstall then  
  begin
    vShell := CreateOleObject('Shell.Application');  
    vFolder := vShell.NameSpace(ExpandConstant('{app}'));  
    vFolderItem := vFolder.ParseName(sFileName);  
    vPinnedShortcutFileName := vShell.NameSpace('shell:User Pinned').self.Path + '\TaskBar\' + vFolder.GetDetailsOf(vFolderItem, 34) + '.lnk';
    UnpinShellLink(vPinnedShortcutFileName);
  end;
end;

Укажите вместо «Program.exe» имя Вашего «MyProg.exe». У меня под Windows 7 работает. Под более новыми версиями, полагаю, могут быть проблемы из-за номера свойства Проводника «Описание файла» (или отсутствия описания).

P.S. По-хорошему, надо попробовать закреплять не сам исполняемый файл из %ProgramFiles%, а ярлык на него, созданный в Главном меню в процессе инсталляции (уже со всеми потребными параметрами).
Это сообщение посчитали полезным следующие участники:

Отправлено: 00:54, 11-04-2016 | #54