Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 9]
Есть рабочий скрипт (его код ниже), который должен создать ярлык на папку. Ярлык создается, но если искать этот ярлык через программу, то программа его не видит. (Даже в Экселе - Файл/Открыть - ярлык не виден).
1.Что в скрипте не так?
2.Как в конце установки вывести галку с предложением открыть папку с настройками (из "{commonappdata}\Inno\Программа") после окончания установки?
Извиняюсь за любопытство! Через какую программу, и какой ярлык вы хотите видеть?
На рабочем столе ярлык папки создается, формулировка ярлык через программу, если вы имеете ввиду Пуск > Программы > Inno 5 > Настройки > Настройки, тогда последняя папка и есть ярлык. Других ярлыков согласно скрипта нет.
(Даже в Экселе - Файл/Открыть - ярлык не виден)
Ярлык какого либо файла, и ярлык папки это разные понятия.
Извиняюсь за любопытство! Через какую программу, и какой ярлык вы хотите видеть?
Ярлык, который должен создастся на Рабочем столе для всех пользователей. Программы, которые должны увидеть ярлык, например, "Экселе" - Файл/Открыть или "Ableton" - File/Open.
Чтобы ярлык виделся в любой программе замените {commondesktop} на {userdesktop}
...но тогда только у текущего пользователя будет ярлык, если я правильно понимаю.
Можно ли создать ярлык все-таки для всех пользователей? И чтобы он был видим и через программы тоже.
»
Добавьте эту строку.
Код:
[Run]
Filename: "{win}\explorer.exe"; Parameters: "{commonappdata}\Inno\Программа"; Description: " »
Спасибо!
Ярлык, который должен создастся на Рабочем столе для всех пользователей. Программы, которые должны увидеть ярлык, например, "Экселе" - Файл/Открыть или "Ableton" - File/Open.
Все в вашем скрипте правильно, с константой {commondesktop} ярлыки будут создаваться на всех рабочих столах пользователей.
Если вы имеете ввиду Microsoft Excel то ярлык на рабочем столе виден Файл > Открыть > Рабочий стол (типы файлов: Все файлы)
Все в вашем скрипте правильно, с константой {commondesktop} ярлыки будут создаваться на всех рабочих столах пользователей.
Если вы имеете ввиду Microsoft Excel то ярлык на рабочем столе виден Файл > Открыть > Рабочий стол (типы файлов: Все файлы) »
Спасибо за ответ, но к сожалению ярлык с константой {commondesktop} через программу под Win10/7 не виден. (Могу сделать скриншот.) Он виден, если использовать {userdesktop} вместо {commondesktop}, как предложил habib2302. Но такой вариант уже не подойдет.
Может ярлыку для всех пользователей не хватает какого-то атрибута?..
к сожалению ярлык с константой {commondesktop} через программу под Win10/7 не виден
Из под вашего скрипта установил программу, ярлыки на рабочем столе и в меню пуск создаются.
Создал ещё одну учетную запись (обычные права, не админ), зашел от имени зтого пользователя, ярлык на рабочем столе виден.
Создал Microsoft Excel Файл > Открыть > Рабочий стол (типы файлов: Все файлы) ярлык на рабочем столе виден.
Win7 Максимальная, Win10 нет.
PS: Во всех ваших вопросах есть какая то недосказанность.
Из под вашего скрипта установил программу, ярлыки на рабочем столе и в меню пуск создаются. »
Для полноты картины вот мой Рабочий стол. На нем 2 ярлыка, созданные через Inno. Один создавался для {commondesktop}, другой для {userdesktop}. Оба ярлыка на Рабочем столе. Но программа видит только тот, который был создан для {userdesktop}.
https://a.radikal.ru/a20/2005/e9/0587f468d065.png (https://radikal.ru)
Вопрос не к Inno Setup, а к вашей ОС
Вопрос не к Inno Setup, а к вашей ОС »
Если бы только у меня так было, но проверялся скрипт на других компьютерах тоже. На Win7 - у всех по-разному, на Win10 - у всех, как у меня.
P.S. Win10 стоит лицензионная.
Но программа видит только тот »Ярлыки и папки общего рабочего стола (https://answers.microsoft.com/ru-ru/windows/forum/windows_10-start-win_desk/%D1%8F%D1%80%D0%BB%D1%8B%D0%BA%D0%B8-%D0%B8/266d9b9d-7480-49c9-9e9f-73e057e7d74f)
Ярлыки и папки общего рабочего стола »
Спасибо. Буду разбираться.
Ярлыки и папки общего рабочего стола »
Спасибо за ссылку, но там на вопрос того пользователя так и не ответили.
Для информации: ОС, на которой проверялся скрипт, "Win10 Домашняя" лицензионная.
Может кто-то сталкивался с подобного рода проблемой?
Может кто-то сталкивался с подобного рода проблемой? »При вашем скрипте: В Windows 7 из сторонней программы через Файл » Открыть/File » Open - ярлыки видны, в Windows 10 - не видны и это нормально, используйте {userdesktop}. Недоразумение никак не связано с Inno Setup, проблему ищите в самой Windows.
Если проблему не обойти, подскажите, пожалуйста, как в скрипте зашить проверку на версию Windows. И если Win7/ХР, то чтобы установка сама шла в {commondesktop}, если же Win10, то в {userdesktop}. Остается тогда вопрос: куда отнести Win8...
Но тогда предвижу еще одну проблему: если ставить будет Админ под своим логином, а не Пользователь, то ярлык будет у Админа, а у Пользователя (для которого вся установка) ярлыка не будет.
Возможно открою Африку, но именно в Win10 ярлык именно на Панели задач создать пока невозможно. Остальные ярлыки создаются без вопросов хоть где на любой ОС, исключая Панель задач Win10.
Возможно открою Африку, но именно в Win10 ярлык именно на Панели задач создать пока невозможно. Остальные ярлыки создаются без вопросов хоть где на любой ОС, исключая Панель задач Win10. »
Программа MPC-BE, Bandicam 4.5.8.1673 Repack elchupacabra при установки создают ярлык на панели задач в Win10
slondovolen
13-06-2020, 13:32
Как сделать, чтобы при повторной установке из созданного инсталлятора, если папка с файлами существует, в папке куда программу устанавливаю, то файлы во вложенной папке не перезаписывались? Но только в этой папке, а другие файлы и папки не заменялись при установке.
Спасибо.
passstrada
13-06-2020, 17:09
Как убрать кнопку с выбором типа установки?
Полная установка
Компактная установка
Выборочная установка
habib2302
13-06-2020, 17:18
passstrada, в скрипте в разделе Types уберите все кроме "Полная установка" и поставьте флаг Flags: iscustom
[Types]
Name: full; Description: Полная установка; Flags: iscustom
passstrada
14-06-2020, 23:16
Резервное копирование изменяемых оригинальных файлов для последующего восстановления.
Решил удалить свои старые сообщения, связать их в кучу, и прикрепить сюда (что бы не мусорить).
Здесь пытался найти ответ на:
Хочу создать модпак, и столкнулся с такой вот идеей
Нужно что бы во время установки мода в указанную папку, и выборе модификаций, делалось backup оригинальных файлов в папку backup с bat файлом, который отправится на рабочий стол.
Допустим я выбираю Мод1 в котором файлы:
*\Data\Gfx2\UI\BattleScreenHUD\Arrow.txt
*\Data\Gfx2\UI\BattleScreenHUD\capturebaseicon.txt
*\Data\Gfx2\UI\BattleScreenHUD\ChatCommandsOuterSectorBg.txt
*\Data\Gfx2\UI\BattleScreenHUD\markers\explosion_bk.txt
*\Data\Gfx2\UI\BattleScreenHUD\markers\standart_damage_marker.txt
И оригинал этих файлов отправился в папку backup:
*\Data\Gfx2\UI\BattleScreenHUD\Arrow.txt
*\Data\Gfx2\UI\BattleScreenHUD\capturebaseicon.txt
*\Data\Gfx2\UI\BattleScreenHUD\ChatCommandsOuterSectorBg.txt
*\Data\Gfx2\UI\BattleScreenHUD\markers\explosion_bk.txt
*\Data\Gfx2\UI\BattleScreenHUD\markers\standart_damage_marker.txt
И так далее, при выборе Мод2 копия оригинала в backup...
Зачем это делать?
На рабочем столе будет создан ярлык bat файла, который при открытии будет делать замену файлов, на оригинальные файлы (которые и будут храниться в папке backup)
Или не батник, а допустим какой-то exe файл.
Не чего особо не нагуглил, что подскажите?
Подскажите пожалуйста
Я всё же интересуюсь сделать backup файлов, которые заменяет, это так скажем "обновление"
Нашел такой вот код? Что скажите?
[Files]
Source: Files\*.*; DestDir: {app}; Flags: ignoreversion recursesubdirs; BeforeInstall: CreateBackup
[Code
function MoveFile(const srcFile, destFile: PChar):Integer;
external 'MoveFileA@kernel32.dll stdcall';
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then
begin
MoveDir(ExpandConstant('{app}\Backup\'),ExpandConstant('{app}'));
RemoveDir(ExpandConstant('{app}\Backup\'));
end;
end;
procedure CreateBackup;
var
srcFile, destFile: string;
basePath, shortPath: string;
begin
basePath:= ExpandConstant('{app}');
srcFile:= ExpandConstant(CurrentFileName);
shortPath:= srcFile;
StringChangeEx(shortPath, basePath, '', True);
destFile:= ExpandConstant('{app}\Backup') + shortPath;
ForceDirectories(ExtractFilePath(destFile));
MoveFile(PChar(srcFile), PChar(destFile));
end;
Мой код:
#define AppName "Modpack"
#define AppVer "v1.0"
[Setup]
AppName={#AppName}
AppVerName=Modpack {#AppVer}
AppVersion={#AppVer}
DefaultDirName=Data
Compression=none
OutputDir=C:\Users\vladi\Desktop
OutputBaseFilename={#AppName} {#AppVer}
InfoBeforeFile=readme.rtf
SetupIconFile=SetupIconFile.ico
WizardSmallImageFile=WizardSmallImageFile.bmp
DisableProgramGroupPage=yes
DisableFinishedPage=True
DisableReadyPage=True
CreateUninstallRegKey=no
Uninstallable=no
[Languages]
;Язык по умолчанию интерфейса установщика
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"
[Messages]
SelectDirLabel3=Укажите папку с игрой
[Icons]
;Создание ярлыка на рабочем столе после успешной установки приложения
Name: "{commondesktop}\Вернуть оригинальные файлы"; IconFilename: bat.ico; Filename: "{app}\_backup\backup.bat"
[InstallDelete]
;Файлы\папки которые должны удалится при Установке приложения
[Types]
Name: full; Description: Полная установка; Flags: iscustom
[Components]
Name: mods; Description: Выберите модификации:;
Name: mods\pritsel; Description: Прицелы:;
Name: mods\pritsel\1; Description: Прицел CrosINC; Flags: exclusive
Name: mods\pritsel\2; Description: Прицел Дамоклов Меч; Flags: exclusive
Name: mods\pritsel\3; Description: Прицел White_v3.1; Flags: exclusive
Name: mods\angar; Description: Ангары:;
Name: mods\angar\1; Description: Ангар Brotherhood Sanctuary; Flags: exclusive
Name: mods\angar\2; Description: Ангар Hangar_WOT; Flags: exclusive
Name: mods\angar\3; Description: Ангар на карте Мираж; Flags: exclusive
[Files]
Source: C:\Mods\pritsel\crosinc\*; Components: mods\pritsel\1; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: C:\Mods\pritsel\damoklov-mech\*; Components: mods\pritsel\2; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: C:\Mods\pritsel\white\*; Components: mods\pritsel\3; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: C:\Mods\angar\Brotherhood-Sanctuary\*; Components: mods\angar\1; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: C:\Mods\angar\Hangar_WOT\*; Components: mods\angar\2; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: C:\Mods\angar\miragg\*; Components: mods\angar\3; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
;Файлы, Оформление окон
Source: "VclStylesinno.dll"; DestDir: {app}; Flags: dontcopy
Source: "SmokeyQuartzKamri.vsf"; DestDir: {app}; Flags: dontcopy
;Файлы, Splash
Source: "isgsg.dll"; DestDir: "{tmp}"; Flags: ignoreversion dontcopy nocompression
Source: "splash.png"; DestDir: "{tmp}"; Flags: ignoreversion dontcopy nocompression
[Code
//Процедура, Оформление окон
procedure LoadVCLStyle(VClStyleFile: String); external 'LoadVCLStyleW@files:VclStylesInno.dll stdcall';
procedure UnLoadVCLStyles; external 'UnLoadVCLStyles@files:VclStylesInno.dll stdcall';
//Процедура, Splash
procedure ShowSplashScreen(p1:HWND;p2:AnsiString;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer);
external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';
//Функция, Оформление окон
function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('SmokeyQuartzKamri.vsf');
LoadVCLStyle(ExpandConstant('{tmp}\SmokeyQuartzKamri.vsf'));
Result := True;
end;
procedure DeinitializeSetup();
begin
UnLoadVCLStyles;
end;
//Функция, Splash
procedure InitializeWizard();
begin
ExtractTemporaryFile('splash.png');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}\splash.png'),1000,3000,1000,0,255,True,$FFF FFF,10);
end;
Есть вторая идея которую довольно реально решить.
При установке, старые файлы переименовать.
А в батнике сделать наоборот, удалять новый файл, а старый переименовать обратно.
Что думаете? Как лучше?
Нашел такой вот код, на просторах интернета.
Помогите втулить в свой код, а то у меня ошибки, то на PChar в первом случаи, то на MoveFile во втором.
При инсталляции, в "бэкап" сохраняются (перемещением) только те файлы,которые инсталлятор заменяет.
При удалении, эти же файлы восстанавливаются (тоже перемещением).
function MoveFile(const srcFile, destFile: PChar): Integer;
external 'MoveFileA@kernel32.dll stdcall';
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then
begin
MoveDir(ExpandConstant('{app}\Install_Rus\Backup\'), ExpandConstant('{app}'));
RemoveDir(ExpandConstant('{app}\Install_Rus\Backup\'));
RemoveDir(ExpandConstant('{app}\Install_Rus\'));
end;
end;
procedure CreateBackup;
var
srcFile, destFile: string;
basePath, shortPath: string;
begin
if IsTaskSelected('src') then
begin
basePath := ExpandConstant('{app}');
srcFile := ExpandConstant(CurrentFileName);
shortPath := srcFile;
StringChangeEx(shortPath, basePath, '', True);
destFile := ExpandConstant('{app}\Install_Rus\Backup') + shortPath;
ForceDirectories(ExtractFilePath(destFile));
MoveFile(PChar(srcFile), PChar(destFile));
end;
end;
Что-то вышло, с вот таким вот кодом:
//Backup
function MoveFile(const srcFile, destFile: PAnsiChar): Integer; external 'MoveFileA@kernel32.dll stdcall';
procedure CreateBackup;
var
srcFile, destFile: string;
basePath, shortPath: string;
begin
if IsTaskSelected('src') then
begin
basePath := ExpandConstant('{app}');
srcFile := ExpandConstant(CurrentFileName);
shortPath := srcFile;
StringChangeEx(shortPath, basePath, '', True);
destFile := ExpandConstant('{app}\Backup') + shortPath;
ForceDirectories(ExtractFilePath(destFile));
MoveFile(PAnsiChar(srcFile), PAnsiChar(destFile));
end;
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then
begin
MoveDir(ExpandConstant('{app}\Backup\'), ExpandConstant('{app}'));
RemoveDir(ExpandConstant('{app}\Backup\'));
end;
end;
Что думаете?
Вроде работает
Ну и я нашел ответ на этот вопрос, и решил поделится с вами:
Моя проблема решилась. Код программы работает отлично.
Для лучшего понимания как работает и для чего нужен:
Допустим вы устанавливаете модификации или обновление на программу или игру, и вам нужно что бы старые файлы сохранились, а в последующем вернулись, если что-то пойдёт не так.
(По началу я думал создать Батник для восстановления файлов, но лучшим способом всё-таки получилось через uninstall).
При установке, в корне программы/игры, создается папка "Backup", туда же помещается наш uninstall.
В итоге при удалении "обновления" старые файлы возвращаются на своё место, новые же удаляются + папка Backup удаляется.
Так как у меня вызывало ошибки на "PChar", я уже прочитав руководство, и изменил на "PAnsiChar", в SHFileOperation.iss:
Руководство: Unicode Pascal Scripting notes: The Unicode compiler sees type 'String' as a Unicode string, and 'Char' as a Unicode character. Its 'AnsiString' type hasn't changed and still is an ANSI string. Its 'PChar' type has been renamed to 'PAnsiChar'.
Для тех кто сюда зайдёт, прикладываю файл и код, может пригодится кому-то в будущем.
Код который вы будите использовать в своем коде:
;Подключаем и выполняем указанный файл
#include "SHFileOperation.iss"
[Setup]
;Создание инсталлятора
Uninstallable=yes
;Куда поместить деинсталлятор
UninstallFilesDir={app}\Backup
[Messages]
;Изменение сообщений в установщике
ConfirmUninstall=Вы действительно ходите вернуть оригинальные файлы?
UninstalledAll=Оригинальные файлы восстановлены!
[Icons]
;Создание ярлыка на рабочем столе после успешной установки приложения
Name: "{commondesktop}\Вернуть оригинальные файлы"; IconFilename: "{app}\Backup\backup.ico"; Filename: "{app}\Backup\unins000.exe"
[Tasks]
;Если хотите, что бы спрашивалось, "Сделать Бэкап заменяемых файлов?" в установке, уберите ";" для активации функции
;Name: src; Description: Сделать Бэкап заменяемых файлов?
; + ОБЯЗАТЕЛЬНО убрать в [C0de] "//". Смотрите ниже
[_Code]
//Начало кода, Backup
function MoveFile(const srcFile, destFile: PAnsiChar): Integer; external 'MoveFileA@kernel32.dll stdcall';
procedure CreateBackup;
var
srcFile, destFile: string;
basePath, shortPath: string;
//begin //Для активации кнопки для Бэкапа убрать в начале begin "//". И в [Tasks] перед Name убрать ";"
//if IsTaskSelected('src') then //Для активации кнопки для Бэкапа убрать в начале if "//". И в [Tasks] перед Name убрать ";"
begin
basePath := ExpandConstant('{app}');
srcFile := ExpandConstant(CurrentFileName);
shortPath := srcFile;
StringChangeEx(shortPath, basePath, '', True);
destFile := ExpandConstant('{app}\Backup') + shortPath; //Создание папки под названием "Backup" в программе. Те файлы которые будут ЗАМЕНЕНЫ отправятся в эту папку
ForceDirectories(ExtractFilePath(destFile));
MoveFile(PAnsiChar(srcFile), PAnsiChar(destFile));
end;
//end; //Для активации кнопки для Бэкапа убрать в начале end; "//". И в [Tasks] перед Name убрать ";"
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then
begin
MoveDir(ExpandConstant('{app}\Backup\'), ExpandConstant('{app}')); //От куда брать файлы при восстановлении бэкапа
RemoveDir(ExpandConstant('{app}\Backup')); //При uninstall удалятся указанная папка Backup
end;
end;
//Конец кода, Backup
+ прилаживаю файл в архиве, который нужен для подключения: 161699
Надеюсь я кому-то помог :happy:
1Виталий1
17-06-2020, 11:14
Помогите пожалуйста как прописать два раза команду:procedure InitializeWizard();
procedure InitializeWizard();
begin
RedesignWizardForm;
end;
procedure InitializeWizard();
begin
ExtractTemporaryFile('bass.dll');
ExtractTemporaryFile('CallbackCtrl.dll');
ExtractTemporaryFile('botva2.dll');
ExtractTemporaryFile('volmax.png');
ExtractTemporaryFile('volmin.png');
ExtractTemporaryFile('voldote.png')
ExtractTemporaryFile('volpb.png')
ExtractTemporaryFile('MusicButton.png');
ExtractTemporaryFile('music.mp3');
BASS_Init('{tmp}\music.mp3')
BASS_CreateMediaPlayer(WizardForm, '{tmp}\volmax.png', '{tmp}\volmin.png', '{tmp}\volpb.png', '{tmp}\voldote.png', 70, 325)
end;
procedure DeinitializeSetup();
begin
Bass_DeInit;
gdipShutdown
end;
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.