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%, а ярлык на него, созданный в Главном меню в процессе инсталляции (уже со всеми потребными параметрами).
|