Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 9]
habib2302
09-02-2020, 14:45
Beavimo, вы этот код даже и не проверяли
https://a.radikal.ru/a04/2002/31/c94159d5271a.png (https://d.radikal.ru/d25/2002/a5/f7c9cf1572bc.jpg)
не работает он на 10-ке
[Setup]
AppName=ICONKA
AppVerName=ICONKA
DefaultDirName=C:\ICONKA
OutputDir=userdocs:..\Desktop
[*Code]
function PinToTaskbar(const FileName: String; IsPin: Boolean): Boolean; var
ShellApp: Variant;
Verb: String;
begin
Result:=False;
if not FileExists(FileName) then
Exit;
try
if IsPin then
Verb:='taskbarpin'
else
Verb:='taskbarunpin';
ShellApp:=CreateOleObject('Shell.Application');
ShellApp.Windows.Item.Document.Application.NameSpace(ExtractFileDir(FileName)).ParseName(ExtractFile Name(FileName)).InvokeVerb(Verb);
Result:=True;
except
ShowExceptionMessage;
end
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssPostInstall then
begin
PinToTaskbar(ExpandConstant('{app}\ICONKA.exe'), True);
end
end;
[Files]
Source: "ICONKA.exe"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
любой "ICONKA.exe" файл рядом положыте, на семерке без проблем а на десятке не робить
зато процедура "CurUninstallStepChanged" прекрасно работает даже на десятке
а это крепит ярлик в меню пуск и оно работает нормально
что на 7-ке что на 10-ке
[Setup]
AppName=ICONKA
AppVerName=ICONKA
DefaultDirName=C:\ICONKA
OutputDir=userdocs:..\Desktop
[*Code]
function PinToStartMenu(const FileName: string; const IsPin: Boolean): Boolean; var
ShellApp, FolderItem: Variant;
Verb, LnkName: string;
begin
Result:=False;
if not FileExists(FileName) then
Exit;
try
ShellApp:=CreateOleObject('Shell.Application');
FolderItem:=ShellApp.Windows.Item.Document.Application.NameSpace(ExtractFileDir(FileName)).ParseName (ExtractFileName(FileName));
if GetWindowsVersion < $06020000 then
begin
if IsPin then
Verb:='startpin'
else
Verb:='startunpin';
FolderItem.InvokeVerb(Verb);
Result:=True;
end
else begin
if not FolderItem.IsLink then
begin
LnkName:=FolderItem.ExtendedProperty('FileDescription');
if LnkName='' then
LnkName:=ExtractFileName(FileName);
LnkName:=ExpandConstant('{commonprograms}\') + ChangeFileExt(LnkName, '.lnk');
if IsPin then
Result:=not FileExists(LnkName) and
FileExists(CreateShellLink(LnkName, '', FileName, '', '', '', 0, SW_SHOWNORMAL))
else
Result:=DeleteFile(LnkName);
end
else begin
LnkName:=ExpandConstant('{commonprograms}\') + ExtractFileName(FolderItem.Path);
if IsPin then
Result:=not FileExists(LnkName) and
FileCopy(FolderItem.Path, LnkName, False)
else
Result:=DeleteFile(LnkName);
end
end;
except
ShowExceptionMessage;
end
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssPostInstall then
begin
PinToStartMenu(ExpandConstant('{app}\ICONKA.exe'), True);
end
end;
[Files]
Source: "ICONKA.exe"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
на десятке не робить »
[CustomMessages]
CreateStartLaunchIcon=Добавить значок My Program в Меню пуск
[Tasks]
Name: startlaunchicon; Description: {cm:CreateStartLaunchIcon}; GroupDescription: {cm:AdditionalIcons}
[Files]
Source: C:\Program Files\Inno Setup 5\Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion
[UninstallDelete]
Name: {commonprograms}\My Program1; Type: filesandordirs; Tasks: startlaunchicon
[Icons]
Name: {commonprograms}\MyProgram1; Filename: {app}\MyProg.exe; Tasks: startlaunchicon
P.S "My Program1" - Отметил для различия.
Nordek, мне нужно прикрепить значок на панель задач в Windows 10, я не могу понять как оно работает Process Monitor не помогает. ПАНЕЛЬ ЗАДАЧ...
[Setup]
AppName=Taskbar1
AppVerName=Taskbar2
DefaultDirName=C:\Taskbar
OutputDir=userdocs:..\Desktop
[*Code]
function PinToTaskbar(const FileName: String; IsPin: Boolean): Boolean; var
ShellApp: Variant;
Verb: String;
begin
Result:=False;
if not FileExists(FileName) then
Exit;
try
if IsPin then
Verb:='taskbarpin'
else
Verb:='taskbarunpin';
ShellApp:=CreateOleObject('Shell.Application');
ShellApp.Windows.Item.Document.Application.NameSpace(ExtractFileDir(FileName)).ParseName(ExtractFile Name(FileName)).InvokeVerb(Verb);
Result:=True;
except
ShowExceptionMessage;
end
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssPostInstall then
PinToTaskbar(ExpandConstant('{app}\Taskbar.exe'), True);
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep=usUninstall then
PinToTaskbar(ExpandConstant('{app}\Taskbar.exe'), False);
end;
[Files]
Source: "Taskbar.exe"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
на 7-ке работает как надо, а на 10-ке тока открепить может если я вручную прикреплю иконку к панели задач то при диинсталляции она удалится.... а прикрепить ее окромя ручками у меня не выходит может я просто туплю уже 3-ю сутку не сплю
El Sanchez
09-02-2020, 18:19
я и говорю что не работает на 10-ке функция PinToTaskbar зато на 7-ке все хорошо... а вот PinToStartMenu работает прекрасно »
Beavimo, Microsoft считает, что закрепление ярлыка на Панели задач должен делать пользователь, а не приложение, и с каждой следующей сборкой что-нибудь да и отпиливают.
const
CLSID_TaskbandPin = '{90AA3A4E-1CBA-4233-B8BB-535773D48449}';
IID_IPinnedList2 = '{BBD20037-BC0E-42F1-913F-E2936BB0EA0C}';
IID_IPinnedList3 = '{0DD79AE2-D156-45D4-9EEB-3B549769E940}';
CLSCTX_INPROC_SERVER = 1;
PLMC_EXPLORER = 4;
S_OK = 0;
type
PItemIDList = LongWord;
IPinnedList2 = interface(IUnknown)
'{BBD20037-BC0E-42F1-913F-E2936BB0EA0C}'
procedure EnumObjects; // dummy
function Modify(unpin, pin: PItemIDList): HRESULT;
procedure GetChangeCount; // dummy
procedure GetPinnableInfo; // dummy
procedure IsPinnable; // dummy
procedure Resolve; // dummy
function IsPinned(pidl: PItemIDList): HRESULT;
procedure GetPinnedItem; // dummy
procedure GetPinnedItemForAppID; // dummy
procedure ItemChangeNotify; // dummy
procedure UpdateForRemovedItemsAsNecessary; // dummy
end;
IPinnedList3 = interface(IUnknown)
'{0DD79AE2-D156-45D4-9EEB-3B549769E940}'
procedure EnumObjects; // dummy
procedure GetPinnableInfo; // dummy
procedure IsPinnable; // dummy
procedure Resolve; // dummy
procedure LegacyModify; // dummy
procedure GetChangeCount; // dummy
function IsPinned(pidl: PItemIDList): HRESULT;
procedure GetPinnedItem; // dummy
procedure GetAppIDForPinnedItem; // dummy
procedure ItemChangeNotify; // dummy
procedure UpdateForRemovedItemsAsNecessary; // dummy
procedure PinShellLink; // dummy
procedure GetPinnedItemForAppID; // dummy
function Modify(unpin, pin: PItemIDList; ModifyCaller: LongWord): HRESULT;
end;
function CoCreateInstance(rclsid: TCLSID; pUnkOuter: LongWord;
dwClsContext: DWORD; riid: TIID; out ppv: IUnknown): HRESULT; external 'CoCreateInstance@ole32.dll stdcall';
function ILCreateFromPath(const pszPath: string): PItemIDList; external 'ILCreateFromPathW@shell32.dll stdcall';
procedure ILFree(pidl: PItemIDList); external 'ILFree@shell32.dll stdcall';
function PinToTaskbar(const AFilename: string; AIsPin: Boolean): Boolean;
// AFilename : full path to executable file
// AIsPin....: False - unpin from TaskBar, True - pin to TaskBar
var
LPIDL: PItemIDList;
LUnk: IUnknown;
LPinnedList2: IPinnedList2;
LPinnedList3: IPinnedList3;
LShellApp: Variant;
LVerb: string;
begin
Result := False;
if FileExists(AFilename) and
(GetWindowsVersion > $06010000) then
try
LPIDL := ILCreateFromPath(AFilename);
try
{ Windows 10 (build 1809) and above. }
OleCheck(CoCreateInstance(StringToGUID(CLSID_TaskbandPin), 0,
CLSCTX_INPROC_SERVER, StringToGUID(IID_IPinnedList3), LUnk));
LPinnedList3 := LUnk as IPinnedList3;
except
try
{ Windows 7, 8, 8.1 if IPinnedList2 supported. }
OleCheck(CoCreateInstance(StringToGUID(CLSID_TaskbandPin), 0,
CLSCTX_INPROC_SERVER, StringToGUID(IID_IPinnedList2), LUnk));
LPinnedList2 := LUnk as IPinnedList2;
except
{ Below Windows 10 (build 1809) fallback. }
LShellApp := CreateOleObject('Shell.Application');
end;
end;
if AIsPin then // pin
begin
if LPinnedList3 <> nil then
begin
Result := LPinnedList3.IsPinned(LPIDL) <> S_OK;
if Result then
OleCheck(LPinnedList3.Modify(0, LPIDL, PLMC_EXPLORER));
end
else if LPinnedList2 <> nil then
begin
Result := LPinnedList2.IsPinned(LPIDL) <> S_OK;
if Result then
OleCheck(LPinnedList2.Modify(0, LPIDL));
end else
LVerb := 'taskbarpin';
end else // unpin
begin
if LPinnedList3 <> nil then
begin
Result := LPinnedList3.IsPinned(LPIDL) = S_OK;
if Result then
OleCheck(LPinnedList3.Modify(LPIDL, 0, PLMC_EXPLORER));
end
else if LPinnedList2 <> nil then
begin
Result := LPinnedList2.IsPinned(LPIDL) = S_OK;
if Result then
OleCheck(LPinnedList2.Modify(LPIDL, 0));
end else
LVerb := 'taskbarunpin';
end;
if LVerb <> '' then
LShellApp.Windows.Item.Document.Application
.NameSpace(ExtractFileDir(AFilename))
.ParseName(ExtractFileName(AFilename)).InvokeVerb(LVerb);
except
Result := False;
ShowExceptionMessage;
finally
ILFree(LPIDL);
end;
end;
function PinToStartMenu(const AFilename: string; AIsPin: Boolean): Boolean;
// AFilename : full path to exe- or lnk-file
// AIsPin : False - unpin from StartMenu, True - pin to StartMenu
var
LShellApp, LFolderItem: Variant;
LVerb, LnkName: string;
begin
Result := False;
if not FileExists(AFilename) then Exit;
try
LShellApp := CreateOleObject('Shell.Application');
LFolderItem := LShellApp.Windows.Item.Document.Application
.NameSpace(ExtractFileDir(AFilename))
.ParseName(ExtractFileName(AFilename));
{ Below Windows 8. }
if GetWindowsVersion < $06020000 then
begin
if AIsPin then
LVerb := 'startpin' else
LVerb := 'startunpin';
LFolderItem.InvokeVerb(LVerb);
Result := True;
end else
{ Windows 8 and above. }
begin
if not LFolderItem.IsLink then
begin
LnkName := LFolderItem.ExtendedProperty('FileDescription');
if LnkName = '' then
LnkName := ExtractFileName(AFilename);
LnkName := ExpandConstant('{commonprograms}\') + ChangeFileExt(LnkName, '.lnk');
if AIsPin then
Result := not FileExists(LnkName) and
FileExists(CreateShellLink(LnkName, '', AFilename, '', '', '', 0, SW_SHOWNORMAL))
else
Result := DeleteFile(LnkName);
end else
begin
LnkName := ExpandConstant('{commonprograms}\') + ExtractFileName(LFolderItem.Path);
if AIsPin then
Result := not FileExists(LnkName) and
FileCopy(LFolderItem.Path, LnkName, False)
else
Result := DeleteFile(LnkName);
end;
end;
except
ShowExceptionMessage;
end;
end;
Microsoft считает, что закрепление ярлыка на Панели задач должен делать пользователь, а не приложение, и с каждой следующей сборкой что-нибудь да и отпиливают. »
Слишком много приложений стали лепить себя на Панель задач (зачастую — молча). Примерно так же, как раньше каждое второе приложение считало своим долгом запихнуть свой значок в область уведомлений. Там нашли решение (кривое, понятно) в виде скрытия по умолчанию всех значков, кроме системных, на отдельную панель. А куда девать налепленные ярлыки с Панели задач — пока не решили.
1) так для справки я (трахну) ето ПИНО однозначно, не верю что не прикручю эту приблуду автоматом к панели на 10-ке, третьи сутки боя идут. 2) устанавливаю виндовс 10-ть раз в год уже 4-ый год подряд, пользуюсь примерно неделю-две, и возвращаюсь назад на 7-ку. решыл попробывать скачать образ 10-ки с оф сайта для тестирования своих наработок в ИННО на перспективной ОС :lol: - опирация прошла успешно, дата последнего обновления (09_01_2020) + онлайн ключики лежат на (philka.ru). 3) у меня на ПК стоит два ссд + винчестер. установил на второй зарание отформатированый ссд Windows 10 Pro. парни скажу чесно я будто обратно на хард пересел, а по сравнению с прошлогодней (08_01_2019) она стала еще больше походить все добро на одной полке, причем все в одном цвете хрен разбиреш что где, интуетивно нихера не понятно (нада учить всьо на изусть), короче бардак полнейшый. от душы лично мое мнение круче ХР по доступу к ресурсам я винды не встречал. а хто говорит мол 7-ка шлак, давно на 10-ке и не жалею, я просто промолчю (ДА ЗДРАВСТВУЕТ РЕКЛАМА в кожну хату)
Слишком много приложений стали лепить себя на Панель задач (зачастую — молча). »Всегда раздражало и раздражает такое ненужное явление.
лично мое мнение круче ХР по доступу к ресурсам я винды не встречал. »Потому и безопасности никакой.
Кстати начиная с 6.0.0-beta:
OS requirements change: Windows 2000, XP, and Server 2003 are no longer supported. Windows Vista is now the minimum supported operating system.
- В том числе и созданные инсталляторы.
Nordek, да я не собырался на автомате ярлык лепить, просто код старался упрость для понимания. а так меня всегда раздажали картинки из игр в ирталлерах, заставки перед запуском, путь для игры с именем репакера или папка в меню пуск с его именем, установка софта поверх уже установленого .... короче кучя дерьма сжатия до придела что уснуть при установке можна, лутше время потратить на коректное извлечение ключей и путей из оригинального дистрибутива, чем ети репаки с музыкой и прочей лабудой клепать. а тут ярлык бог сека открепил и все
Nordek, ладно дружыще я просто немного ни в сибе третью сутку без сна, если что не так в правописании я со Львова, Руского никогда не изучал
а так меня всегда раздажали картинки из игр в ирталлерах, заставки перед запуском, путь для игры с именем репакера или папка в меню пуск с его именем, установка софта поверх уже установленого .... короче кучя дерьма »
А сами хотите лепить то же самое (http://forum.oszone.net/post-2908454.html#post2908454), а :)? Коллега, как это понимать?
Iska, :not-me: я просто хотел сделать свою форму для всех инсталлеров, одну форму оригинальную как на фото что я приводил, без музыки без кучи переходов с разными картинками, без своего имени у названия инсталятора и темболие папок со своим именем, без галочок доп софта взял все кредисты от 2010 запихнул в инсталлер он проверил если есть то не устанавливал, чтобы потом не висело по неськолько деинсталяторов в компонентах, минимум галочек вкладок ненужного текста максимальная скорость установки, пускай и проиграю в весе, все что от себя ето например малинький штамп на форме гдето в уголке но если устанавливается например Aster-V7 со встроиным сбросом триала, то папка без возможности изменений во (все программы) так и називалась Aster-V7, а не Beavimo :moderator, если я случайно удалю ярлык с робочего стола я полезу в все программы искать программу а не автора инсталлера. ладно думаю более мение доходчиво обяснил. и вопше сначала мотор тормоза колеса рулевая.... а покраска в конце, а не код на десять страниц + куча дллок, пожал до усрачки качаешь быстрей чем устанавливаешь, а самые больные бывает в игру при запуске свое лого запихнут это придел совершенства, не в обиду, просто достали типа блогеры. щенки мамины текст зазубрил а сам нуб в теме... нет я не говорю что я программер но я не пригаю выше головы ладно я завелся фен пошла четвертая сутка и самое главное ети все виртуалки и прочее мне до етого не были знакомы, так что бесят поиски однострочного ответа часами, блохеры мать их :tongue:
я просто хотел сделать свою форму для всех инсталлеров »Это ваше право что хотите сделать, а для себя всё что только взумается. В сообщении #495 имеются ссылки на скрипты. Поискав там же, можно найте ещё больше. Увидите наглядно что можно сделать с помощью Inno.
форму оригинальную как на фото что я приводил »
https://i2.imageban.ru/thumbs/2020.02.10/1ef17fb7a065d78b5b571db3b5a42022.png (https://i2.imageban.ru/out/2020/02/10/1ef17fb7a065d78b5b571db3b5a42022.png)
Простота - Это высшее достижение в искусстве.
habib2302
12-02-2020, 02:25
Доброе время суток. Надо доработать кусок скрипта. Хочу, чтобы при нажатии кнопки нет на msgbox'е инсталлятор завершил работу, но не через task kill, а чтобы была полная имитация кнопки отмены.
[Code]
function UninstallMyApp(): Boolean;
var
Buff: String;
i: Integer;
begin
Result := not RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallString', Buff );
if not Result then Result := not FileExists(RemoveQuotes(Buff));
if not Result then if MsgBox('Перед установкой необходимо удалить предыдущую версию {#Name}. Продолжить?', mbError, MB_YESNO) = IDYES then
try
Exec(RemoveQuotes(Buff), '', ExtractFilePath(RemoveQuotes(Buff)), SW_SHOW, ewWaitUntilTerminated, i);
finally
Result := not RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallString', Buff );
if not Result then MsgBox('Удаление завершилось неудачей!', mbError, MB_OK);
end;
end;
Procedure CurPageChanged(CurPageID: Integer);
Begin
Case CurPageID of
wpSelectComponents: if WizardForm.Tag = 1 then
begin
if IsComponentSelected('APP\I') then
begin
UninstallMyApp;
end;
end;
end;
Gnom_aka_Lexander
12-02-2020, 03:59
habib2302,
function NextButtonClick(CurPageID: Integer): Boolean;
begin
if CurPageID = wpWelcome then
if MsgBox('Отменить установку?',mbInformation, MB_YESNO)= IDYES then
WizardForm.CancelButton.Click;
Result := True;
end;
Не везде сработает корректно, нужно пробовать
habib2302
12-02-2020, 13:00
Gnom_aka_Lexander, Вы не правильно поняли. Хочу, чтобы при нажатии кнопки нет на msgbox'е инсталлятор завершил работу, но не через task kill, а чтобы была полная имитация кнопки отмены.
Я имел ввиду про этот if not Result then if MsgBox('Перед установкой необходимо удалить предыдущую версию {#Name}. Продолжить?', mbError, MB_YESNO) = IDYES then
Gnom_aka_Lexander
12-02-2020, 13:38
habib2302, Ну так.then
WizardForm.CancelButton.Click; вызывает действие нажатия кнопки отмены. Далее если нужно, можно взять из примеров скрытие запроса подтверждения отмены, если не хочется лишних диалогов. Таким образом отмена происходит полностью штатно.
Кнопка Нет - IDNO
function UninstallMyApp(): Boolean;
var
Buff: String;
i, id : Integer;
begin
Result := not RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallString', Buff );
if not Result then Result := not FileExists(RemoveQuotes(Buff));
if not Result then id := MsgBox('Перед установкой необходимо удалить предыдущую версию {#Name}. Продолжить?', mbError, MB_YESNO);
case id of
IDYES: try
Exec(RemoveQuotes(Buff), '', ExtractFilePath(RemoveQuotes(Buff)), SW_SHOW, ewWaitUntilTerminated, i);
finally
Result := not RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallString', Buff );
if not Result then MsgBox('Удаление завершилось неудачей!', mbError, MB_OK);
end;
IDNO: WizardForm.CancelButton.Click;
end;
end;
Меня не было целых 8 лет, а так ничего не изменилось. указать направление помощью не считается, только готовое, только хардкор )
habib2302
12-02-2020, 13:42
Gnom_aka_Lexander, пример с моим кодом можно
Gnom_aka_Lexander
12-02-2020, 15:02
Inno Setup registry finder
Накорябал уже сто лет тому назад, да вот все как-то недосуг выложить было. Программа делает поиск в реестре по заданной маске и форматирует найденное в записи, пригодные для использования в скрипте, с конвертацией путей в переменные Inno Setup, алгоритм конвертации предоставил Serega (http://forum.oszone.net/member.php?userid=88670). По сути, это GUI для его конвертера с добавленной возможностью автоматизировать поиск нужных ключей.
Так-же есть возможность указать путь, который нужно заменить на {app}.
Так-же прилагаю библиотеку по поиску Sid. Не помню зачем, но она вроде нужна )
а можно из секции [Code] запустить службу, например службу Центр обновления Windows?
Люди помогите решить проблему. Что то я никак не вкурю, как удалить из строки символ? Рабочего примера найти не могу, и догнать не могу. Может я не там копаю, может мне не из строки удалять нужно? Подскажите, а то опять сутку убил а решения все нету. Вот пример берет из реестра путь для установки.
[Setup]
AppName=TEST
AppVerName=TEST
OutputDir=userdocs:..\Desktop
CreateAppDir=no
Uninstallable=no
[*Code]
function InitializeSetup(): Boolean;
begin
if FileExists(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\IEXPLORE.EXE,Path}')) then
Result:= True
else
MsgBox('Установка Прекращена:'#13'Файл не найден!', mbCriticalError, MB_OK);
end;
Path=C:\Program Files (x86)\Internet Explorer\IEXPLORE.EXE;
но в реестре, в конце пути стоит символ {;} как его удалить? что бы было вот так
Path=C:\Program Files (x86)\Internet Explorer\IEXPLORE.EXE
а еще лутше так
C:\Program Files (x86)\Internet Explorer
тоисть удалить все что идет посте последнего \
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC