Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 8]
Где прописать не могу найти. »
Содержимое 106-й и 132-й строк в коде замените на:
EditTreeView.Text := AddBackslash(DirTreeView.Directory) + ExtractFileName( _szPath );
Если я верно Вас понял.
saurn,
Содержимое 106-й и 132-й строк в коде замените на:
Может на рисунках будет понятней.
ZVSRus,
Имена папок к логике скрипта не имеют никакого отношения. Инсталятору указано автоматически подставлять имя последней папки в пути установки. Данный скрипт вполне самодостаточен, однако имена каталогов в нем указаны, лишь для примера того, как все это будет работать. Как оперировать с именами каталогов в скрипте - это уже ваше дело.
===================================================================================
#define Name "Test"
[Setup]
SourceDir=.
OutputDir=Setup
AppName=Test
AppVerName=Test
DefaultDirName={pf}\Test
DefaultGroupName=Test
OutputBaseFilename=Setup
AllowNoIcons=true
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[Files]
Source: {win}\help\*; DestDir: {app}\Files; Flags: external recursesubdirs createallsubdirs;
[Icons]
Name: {group}\MyProg; Filename: {app}; WorkingDir: {app}
[CustomMessages]
russian.RestoreButton=Сброс
[Code]
var
ISCustomPage1: TWizardPage;
Installer: TNewRadioButton;
Portable: TNewRadioButton;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
_szPath: String;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure RedesignWizardForm;
begin
ISCustomPage1 := CreateCustomPage(wpWelcome, 'ISCustomPage1_Caption', 'ISCustomPage1_Description');
{ Installer }
Installer := TNewRadioButton.Create(WizardForm);
with Installer do
begin
Parent := ISCustomPage1.Surface;
Left := ScaleX(16);
Top := ScaleY(32);
Width := ScaleX(113);
Height := ScaleY(17);
Caption := 'Установка';
Checked := True;
end;
{ Portable }
Portable := TNewRadioButton.Create(WizardForm);
with Portable do
begin
Parent := ISCustomPage1.Surface;
Left := ScaleX(16);
Top := ScaleY(72);
Width := ScaleX(113);
Height := ScaleY(17);
Caption := 'Распаковка';
end;
Installer.TabOrder := 0;
Portable.TabOrder := 1;
end;
#define A = (Defined UNICODE) ? "W" : "A"
const
DRIVE_CDROM = 5;
var
BrowseForm: TSetupForm;
BrowseForm2: TSetupForm;
DirTreeView: TFolderTreeView;
DirFolderTreeView: TStartMenuFolderTreeView;
EditTreeView: TNewEdit;
EditFolderTreeView: TNewEdit;
DB_Button: TNewButton;
GB_Button: TNewButton;
OldEvent_NoIconsCheckClick: TNotifyEvent;
OKButton, ButtonNewFolder: TButton;
function GetDriveType(nDrive: string): Longint; external 'GetDriveType{#A}@kernel32.dll stdcall';
////////////////////////////////////////////////////////////////////////////////////////////////
function _szNameLastFolder( const _szPath: String ): String;
{ _szPath: path from which you want to get the name of the last folder }
{ Declared local variables }
var
_i: Integer;
_nLen: Integer;
_szBuff: String;
begin
_szBuff := RemoveBackslash( _szPath );
_nLen := Length( _szBuff );
for _i := _nLen downto 1 do
begin
if ( _szBuff[_i] = '\' ) then
Break; { Stumbled upon a slash , stop the cycle }
Result := Format( '%s%s', [Result, _szBuff[_i]] );
end;
_szBuff := Result;
Result := '';
_nLen := Length( _szBuff );
for _i := _nLen downto 1 do
Result := Format( '%s%s', [Result, _szBuff[_i]] );
end;
////////////////////////////////////////////////////////////////////////////////////////////////
function CDROM(Drive: String): Boolean;
begin
Result:= GetDriveType(Drive) = 5;
end;
procedure GetDrive(Sender: TObject);
var
Path, Path1: String;
begin
Path:= ExtractFileDrive(DirTreeView.Directory);
Path1:= ExtractFileDrive(EditTreeView.Text);
ButtonNewFolder.Enabled:= not CDROM(Path);
OKButton.Enabled:= not CDROM(Path1);
if CDROM(Path1) then MsgBox('Установка на выбранный диск невозможна!', mbError, MB_OK);
end;
procedure DirTreeViewChange(Sender: TObject);
begin
if DirTreeView.Directory <> WizardForm.DirEdit.Text then begin
/////////////////////////////////////////////////////////////////////////////////////////////////////////
EditTreeView.Text := AddBackslash(DirTreeView.Directory) + _szNameLastFolder( _szPath );
/////////////////////////////////////////////////////////////////////////////////////////////////////////
GetDrive(nil);
end else
EditTreeView.Text := DirTreeView.Directory;
end;
procedure DirFolderTreeViewChange(Sender: TObject);
begin
if DirFolderTreeView.Directory <> WizardForm.GroupEdit.Text then
EditFolderTreeView.Text := AddBackslash(DirFolderTreeView.Directory) + '{#Name}' else
EditFolderTreeView.Text := DirFolderTreeView.Directory;
end;
procedure BrowseFormButtonsTreeViewOnClick(Sender: TObject);
begin
case TButton(Sender).Tag of
1: begin
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
EditTreeView.Text := _szPath;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
GetDrive(nil);
end;
2: begin
DirTreeView.CreateNewDirectory(SetupMessage(msgNewFolderName));
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
EditTreeView.Text := AddBackslash(DirTreeView.Directory) + _szNameLastFolder( _szPath );
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
end;
3: if EditTreeView.Text <> WizardForm.DirEdit.Text then WizardForm.DirEdit.Text := EditTreeView.Text;
end;
end;
procedure BrowseFormButtonsFolderTreeViewOnClick(Sender: TObject);
begin
case TButton(Sender).Tag of
4: EditFolderTreeView.Text := RemoveBackslashUnlessRoot(ExpandConstant('{#Name}'));
5: begin
DirFolderTreeView.CreateNewDirectory(SetupMessage(msgNewFolderName));
EditFolderTreeView.Text := AddBackslash(DirFolderTreeView.Directory) + '{#Name}';
end;
6: if EditFolderTreeView.Text <> WizardForm.GroupEdit.Text then WizardForm.GroupEdit.Text := EditFolderTreeView.Text;
end;
end;
procedure BrowseDirTreeViewClick(Sender: TObject);
begin
BrowseForm := CreateCustomForm();
with BrowseForm do
begin
Width := ScaleX(413);
Height := ScaleY(361);
Caption := SetupMessage(msgBrowseDialogTitle);
Position := poScreenCenter;
with TLabel.Create(nil) do
begin
SetBounds(ScaleX(12), ScaleY(12), ScaleX(207), ScaleY(16));
Caption := SetupMessage(msgBrowseDialogLabel);
Parent := BrowseForm;
Font.Size := 8;
end;
DirTreeView := TFolderTreeView.Create(nil)
with DirTreeView do
begin
SetBounds(ScaleX(16), ScaleY(64), ScaleX(375), ScaleY(225));
OnChange := @DirTreeViewChange;
Parent := BrowseForm;
end;
EditTreeView := TNewEdit.Create(nil);
with EditTreeView do
begin
SetBounds(ScaleX(16), ScaleY(36), ScaleX(376), ScaleY(21));
Text := DirTreeView.Directory;
Parent := BrowseForm;
Font.Color := clWindowText;
end;
with TButton.Create(nil) do
begin
SetBounds(ScaleX(16), ScaleY(301), ScaleX(90), ScaleX(23));
Parent := BrowseForm;
Caption := SetupMessage(msgButtonCancel);
ModalResult := mrCancel;
end;
with TButton.Create(nil) do
begin
SetBounds(ScaleX(111), ScaleY(301), ScaleX(90), ScaleY(23));
Parent := BrowseForm;
Caption := ExpandConstant('{cm:RestoreButton}');
Tag := 1;
OnClick := @BrowseFormButtonsTreeViewOnClick;
end;
ButtonNewFolder:= TButton.Create(nil)
with ButtonNewFolder do
begin
SetBounds(ScaleX(206), ScaleY(301), ScaleX(90), ScaleY(23));
Parent := BrowseForm;
Caption := SetupMessage(msgButtonNewFolder);
Tag := 2;
OnClick := @BrowseFormButtonsTreeViewOnClick;
end;
OKButton:= TButton.Create(nil);
with OKButton do
begin
SetBounds(ScaleX(301), ScaleY(301), ScaleX(90), ScaleY(23));
Parent := BrowseForm;
Caption := SetupMessage(msgButtonOK);
Tag := 3;
OnClick := @BrowseFormButtonsTreeViewOnClick;
ModalResult := mrOk;
end;
DirTreeView.ChangeDirectory(AddBackslash(WizardForm.DirEdit.Text), True);
ShowModal;
Free;
end;
end;
procedure BrowseDirFolderTreeViewClick(Sender: TObject);
begin
BrowseForm2 := CreateCustomForm();
with BrowseForm2 do
begin
Width := ScaleX(413);
Height := ScaleY(361);
Caption := SetupMessage(msgBrowseDialogTitle);
Position := poScreenCenter;
with TLabel.Create(nil) do
begin
SetBounds(ScaleX(12), ScaleY(12), ScaleX(207), ScaleY(16));
Caption := SetupMessage(msgBrowseDialogLabel);
Parent := BrowseForm2;
Font.Size := 8;
end;
DirFolderTreeView := TStartMenuFolderTreeView.Create(nil)
with DirFolderTreeView do
begin
SetBounds(ScaleX(16), ScaleY(64), ScaleX(375), ScaleY(225));
SetPaths(ExpandConstant('{userprograms}'),ExpandConstant('{commonprograms}'),ExpandConstant('{userst artup}'),ExpandConstant('{commonstartup}'));
OnChange := @DirFolderTreeViewChange;
Parent := BrowseForm2;
end;
EditFolderTreeView := TNewEdit.Create(nil);
with EditFolderTreeView do
begin
SetBounds(ScaleX(16), ScaleY(36), ScaleX(376), ScaleY(21));
Text := DirFolderTreeView.Directory;
Parent := BrowseForm2;
Font.Color := clWindowText;
end;
with TButton.Create(nil) do
begin
SetBounds(ScaleX(16), ScaleY(301), ScaleX(90), ScaleX(23));
Parent := BrowseForm2;
Caption := SetupMessage(msgButtonCancel);
ModalResult := mrCancel;
end;
with TButton.Create(nil) do
begin
SetBounds(ScaleX(111), ScaleY(301), ScaleX(90), ScaleY(23));
Parent := BrowseForm2;
Caption := ExpandConstant('{cm:RestoreButton}');
Tag := 4;
OnClick := @BrowseFormButtonsFolderTreeViewOnClick;
end;
with TButton.Create(nil) do
begin
SetBounds(ScaleX(206), ScaleY(301), ScaleX(90), ScaleY(23));
Parent := BrowseForm2;
Caption := SetupMessage(msgButtonNewFolder);
Tag := 5;
OnClick := @BrowseFormButtonsFolderTreeViewOnClick;
end;
with TButton.Create(nil) do
begin
SetBounds(ScaleX(301), ScaleY(301), ScaleX(90), ScaleY(23));
Parent := BrowseForm2;
Caption := SetupMessage(msgButtonOK);
Tag := 6;
OnClick := @BrowseFormButtonsFolderTreeViewOnClick;
ModalResult := mrOk;
end;
DirFolderTreeView.ChangeDirectory(AddBackslash(WizardForm.GroupEdit.Text), True);
ShowModal;
Free;
end;
end;
procedure NoIconsCheckClick(Sender: TObject);
begin
OldEvent_NoIconsCheckClick(Sender);
GB_Button.Enabled := not WizardForm.NoIconsCheck.Checked;
end;
procedure InitializeWizard();
begin
RedesignWizardForm;
OldEvent_NoIconsCheckClick := WizardForm.NoIconsCheck.OnClick;
WizardForm.NoIconsCheck.OnClick := @NoIconsCheckClick;
WizardForm.DirBrowseButton.Hide;
DB_Button := TNewButton.create(WizardForm);
with DB_Button do
begin
Parent := WizardForm.SelectDirPage;
SetBounds(WizardForm.DirBrowseButton.Left, WizardForm.DirBrowseButton.Top, WizardForm.DirBrowseButton.Width, WizardForm.DirBrowseButton.Height - ScaleY(1));
Caption := SetupMessage(msgButtonBrowse);
OnClick := @BrowseDirTreeViewClick;
end;
WizardForm.GroupBrowseButton.Hide;
GB_Button := TNewButton.create(WizardForm);
with GB_Button do
begin
Parent := WizardForm.SelectProgramGroupPage;
SetBounds(WizardForm.GroupBrowseButton.Left, WizardForm.GroupBrowseButton.Top, WizardForm.GroupBrowseButton.Width, WizardForm.GroupBrowseButton.Height - ScaleY(1));
Caption := SetupMessage(msgButtonBrowse);
OnClick := @BrowseDirFolderTreeViewClick;
end;
end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure CurPageChanged(CurPageID: Integer);
begin
case CurPageID of
wpSelectDir:
begin
case Installer.Checked of
False: _szPath := ( AddBackslash(ExpandConstant('{src}')) + '{#Name}Portable' );
True: _szPath := RemoveBackslashUnlessRoot(ExpandConstant('{#SetupSetting("DefaultDirName")}') );
end;
WizardForm.DirEdit.Text := _szPath;
end;
end;
end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
[ISFormDesigner]
WizardForm=FF0A005457495A415244464F524D003010C403000054504630F10B5457697A617264466F726D0A57697A61726 4466F726D0C436C69656E744865696768740368010B436C69656E74576964746803F1010C4578706C696369744C656674020 00B4578706C69636974546F7002000D4578706C6963697457696474680301020E4578706C69636974486569676874038E010 D506978656C73506572496E636802600A54657874486569676874020D00F10C544E65774E6F7465626F6F6B0D4F757465724 E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B57656C636F6D6550616765084E65787450616765070D4 953437573746F6D50616765310D4578706C69636974576964746803F1010E4578706C696369744865696768740339010000F 110544E65774E6F7465626F6F6B5061676509496E6E6572506167650D4578706C69636974576964746803F1010E4578706C6 963697448656967687403390100F10C544E65774E6F7465626F6F6B0D496E6E65724E6F7465626F6F6B00F110544E65774E6 F7465626F6F6B506167650B4C6963656E7365506167650C50726576696F757350616765070D4953437573746F6D506167653 10D4578706C69636974576964746803A1010E4578706C6963697448656967687403ED000000F110544E65774E6F7465626F6 F6B506167650D53656C65637
habib2302
03-02-2016, 12:03
Доброе время суток. помогите решить проблему с этим компонентом.
Name: AFP\I; Description: Установить {#MyAppName}; Flags: disablenouninstallwarning; Types: full;
Потому, что если указать этот компонент в командной строке, то получается вот что.
http://savepic.ru/8520136.png (http://savepic.ru/8523208.png)
или подскажите как сделать так, чтобы при выборе 1-го или нескольких этих компонентов
[Components]
Name: AFP\I\AX; Description: Для Internet Explorer; Flags: disablenouninstallwarning; Types: full;
Name: AFP\I\NPAPI; Description: Для AOL, Firefox, Netscape, Opera; Flags: disablenouninstallwarning; Types: full;
Name: AFP\I\PPAPI; Description: Для платформы Chromium; Flags: disablenouninstallwarning; Types: full;
снималась галочка с этого компонента
[Components]
Name: AFP\I\ALL; Description: Для Всех Браузеров; Flags: disablenouninstallwarning; Types: full;
и становился неактивным. и так на оборот.
Скрипт (https://yadi.sk/i/GGwyheQVoDLud)
Dodakaedr
04-02-2016, 20:29
или подскажите как сделать »
#define MyAppName "My Program"
#define MyAppVersion "1.5"
[Setup]
AppName={#MyAppName}
AppVersion={#MyAppVersion}
DefaultDirName={pf}\{#MyAppName}
[Languages]
Name: "default"; MessagesFile: "compiler:Default.isl"
[Components]
Name: AFP; Description: {#MyAppName}; Flags: fixed disablenouninstallwarning; Types: full;
Name: AFP\I; Description: Установить {#MyAppName}; Flags: disablenouninstallwarning; Types: full;
Name: AFP\I\AX; Description: Для Internet Explorer; Flags: disablenouninstallwarning; Types: full;
Name: AFP\I\NPAPI; Description: Для AOL, Firefox, Netscape, Opera; Flags: disablenouninstallwarning; Types: full;
Name: AFP\I\PPAPI; Description: Для платформы Chromium; Flags: disablenouninstallwarning; Types: full;
Name: AFP\I\ALL; Description: Для Всех Браузеров; Flags: disablenouninstallwarning; Types: full;
[code]
procedure checking(sender: tobject);
begin
if WizardForm.ComponentsList.Checked[5] = true then
begin
WizardForm.ComponentsList.Checked[2] := false;
WizardForm.ComponentsList.ItemEnabled[2] := false;
WizardForm.ComponentsList.Checked[3] := false;
WizardForm.ComponentsList.ItemEnabled[3] := false;
WizardForm.ComponentsList.Checked[4] := false;
WizardForm.ComponentsList.ItemEnabled[4] := false;
end else begin
WizardForm.ComponentsList.ItemEnabled[2] := true;
WizardForm.ComponentsList.ItemEnabled[3] := true;
WizardForm.ComponentsList.ItemEnabled[4] := true;
end;
if (WizardForm.ComponentsList.Checked[2] or WizardForm.ComponentsList.Checked[3] or WizardForm.ComponentsList.Checked[4]) then
begin
WizardForm.ComponentsList.Checked[5] := false;
WizardForm.ComponentsList.ItemEnabled[5] := false;
end else
WizardForm.ComponentsList.ItemEnabled[5] := true;
end;
procedure InitializeWizard();
begin
WizardForm.ComponentsList.Checked[2] := false;
WizardForm.ComponentsList.Checked[3] := true;
WizardForm.ComponentsList.Checked[4] := false;
WizardForm.ComponentsList.Checked[5] := false;
WizardForm.ComponentsList.ItemEnabled[5] := false;
WizardForm.ComponentsList.OnClickCheck := @checking;
end;
a.k.a. Rasputin
05-02-2016, 15:17
Помогите пожалуйста со скриптом (или хотя бы ссылкой, где описано решение).
Задача такая:
1. создать простой установщик (на данном этапе проблем не возникает)
2. установщик должен заменить файлы (в разных директориях) и сделать бэкап оригиналов в отдельную папку
3. при деинсталляции оригинальные файлы должны вернуться обратно на свои места
djbionicl
06-02-2016, 12:01
Подскажите, как сделать, чтобы после установки программы, она не просила регистрацию?
То есть если у меня уже зарегестрированная версия, она же и перенеслась на другой комп.
Dodakaedr
06-02-2016, 18:57
Задача такая: »
Решение такое:
#define MyAppName "My Program"
#define MyAppVersion "1.5"
[Setup]
AppName={#MyAppName}
AppVersion={#MyAppVersion}
DefaultDirName={pf}\{#MyAppName}
OutputDir=.
[Languages]
Name: "default"; MessagesFile: "compiler:Default.isl"
[Files]
Source: "{app}\1.txt"; DestDir: "{app}\txt"; BeforeInstall: "BackupFile()"; Flags: ignoreversion
Source: "{app}\2.txt"; DestDir: "{app}"; BeforeInstall: "BackupFile()"; Flags: ignoreversion
Source: "{app}\1.cjstyles"; DestDir: "{app}\cjstyles"; BeforeInstall: "BackupFile()"; Flags: ignoreversion
Source: "{app}\1.rtf"; DestDir: "{app}\txt"; BeforeInstall: "BackupFile()"; Flags: ignoreversion
Source: "{app}\1.zip"; DestDir: "{app}\zip"; BeforeInstall: "BackupFile()"; Flags: ignoreversion
[code]
type
#ifdef UNICODE
#define A "W"
PChar = PAnsiChar;
#else
#define A "A"
#endif
TSHFileOpStruct = record
Wnd: HWND;
wFunc: UINT;
pFrom: PChar;
pTo: PChar;
fFlags: Word;
fAnyOperationsAborted: BOOL;
hNameMappings: HWND;
lpszProgressTitle: PChar;
end;
const
FO_MOVE = $0001;
FO_COPY = $0002;
FOF_SILENT = $0004;
FOF_NOCONFIRMATION = $0010;
FOF_FILESONLY = $0080;
FOF_NOCONFIRMMKDIR = $0200;
function SHFileOperation(const lpFileOp: TSHFileOpStruct):Integer; external 'SHFileOperation@shell32.dll stdcall';
procedure BackupFile();
var
file, backFile, backpath: string;
begin
if FileExists(ExpandConstant(CurrentFileName)) then
begin
File := ExpandConstant(CurrentFileName);
backpath := file;
StringChangeEx(backpath, ExpandConstant('{app}'), '', True);
backFile := ExpandConstant('{app}\Backup') + backpath;
ForceDirectories(ExtractFilePath(backfile));
RenameFile(file, backfile);
end;
end;
function BackupDir(const fromDir, toDir: ansistring; IsMove: Boolean): Boolean;
var
fos: TSHFileOpStruct;
_fromDir, _toDir: ansistring;
SR: TFindRec;
res: Boolean;
begin
ForceDirectories(toDir);
if IsMove then
fos.wFunc := FO_MOVE else
fos.wFunc := FO_COPY;
fos.fFlags := FOF_FILESONLY or FOF_SILENT or
FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
_fromDir:= AddBackslash(fromDir);
_toDir := AddBackslash(toDir);
if (Length(fromDir) = Length(_fromDir)) then
begin
res:= FindFirst(_fromDir + '*', SR);
try
while res do
begin
if (SR.Name <> '') and (SR.Name <> '.') and (SR.Name <> '..') then
begin
if SR.Attributes = FILE_ATTRIBUTE_DIRECTORY then
begin
_fromDir:= _fromDir + SR.Name + #0#0;
_toDir := _toDir + #0#0;
fos.pFrom := PChar(_fromDir);
fos.pTo := PChar(_toDir);
end else
begin
_fromDir:= _fromDir + SR.Name + #0#0;
_toDir := _toDir + SR.Name + #0#0;
fos.pFrom := PChar(_fromDir);
fos.pTo := PChar(_toDir);
end;
Result := (0 = ShFileOperation(fos));
_fromDir:= ExtractFilePath(_fromDir);
_toDir:= ExtractFilePath(_toDir);
end;
res := FindNext(SR);
end;
finally
FindClose(SR);
end;
end else
begin
_fromDir:= RemoveBackslashUnlessRoot(_fromDir) + #0#0;
_toDir := RemoveBackslashUnlessRoot(_toDir) + #0#0;
fos.pFrom := PChar(_fromDir);
fos.pTo := PChar(_toDir);
Result := (0 = ShFileOperation(fos));
end;
end;
procedure RestoreBackup(backDir: string);
begin
BackupDir(backDir, ExpandConstant('{app}'), True);
DelTree(backDir, true, true, true);
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usdone then
begin
RestoreBackup(ExpandConstant('{app}\Backup\'));
end;
end;
То есть если у меня уже зарегестрированная версия, она же и перенеслась на другой комп. »
Определите где программа хранит свои рег. данные и занесите их в свой установщик. Как это сделать можно найти в интернете.
a.k.a. Rasputin
06-02-2016, 19:49
Dodakaedr,
от души благодарю! Скрипт работает. А то я сижу второй день, вчитываюсь в документацию.
Если вас не затруднит, подскажите пожалуйста, каким образом сделать так, чтобы путь установки брался из реестра? В реестре же в упор не нахожу ключей, которые бы указывали путь.
Dodakaedr
06-02-2016, 20:20
чтобы путь установки брался из реестра? В реестре же в упор не нахожу ключей, которые бы указывали путь. »
Путь берется из ключа реестра деинсталлятора. В справке в разделе "Константы" есть небольшое описание получения значения.
[setup]
appname=app
appvername=app 1.0
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Inno Setup 5_is1,InstallLocation|{pf}\My Program}
djbionicl
06-02-2016, 22:20
Определите где программа хранит свои рег. данные и занесите их в свой установщик. Как это сделать можно найти в интернете. »
Вот я и нашёл форум и спрашиваю. Больше ни где нет информации, либо она на английском.
Dodakaedr
06-02-2016, 22:30
Больше ни где нет информации, либо она на английском. »
Действительно? Введите в googl'e "Как отследить изменения в системе после установки программы?"
a.k.a. Rasputin
07-02-2016, 01:19
Цитата Dodakaedr:
Путь берется из ключа реестра деинсталлятора. В справке в разделе "Константы" есть небольшое описание получения значения. »
еще раз спасибо!
С бэкапом небольшая загвоздка выходит.
В папке Data находятся файлы для бэкапа - Data/Файлы
После бэкапа имеем такую структуру - Backup/Data/Файлы. А вот после деинсталляции получается так - Data/Data/Файлы, а должно Data/Файлы, т.е. файлы возвращаются в папке.
На всякий случай кусок кода, возможно, я что-то неправильно делаю
[Files]
Source: "F:\Data\*.assets"; DestDir: "{app}\Data"; BeforeInstall: "BackupFile()"; Flags: ignoreversion
;Source: "{app}\2.txt"; DestDir: "{app}"; BeforeInstall: "BackupFile()"; Flags: ignoreversion
;Source: "{app}\1.cjstyles"; DestDir: "{app}\cjstyles"; BeforeInstall: "BackupFile()"; Flags: ignoreversion
;Source: "{app}\1.rtf"; DestDir: "{app}\txt"; BeforeInstall: "BackupFile()"; Flags: ignoreversion
;Source: "{app}\1.zip"; DestDir: "{app}\zip"; BeforeInstall: "BackupFile()"; Flags: ignoreversion
[code]
type
#ifdef UNICODE
#define A "W"
PChar = PAnsiChar;
#else
#define A "A"
#endif
TSHFileOpStruct = record
Wnd: HWND;
wFunc: UINT;
pFrom: PChar;
pTo: PChar;
fFlags: Word;
fAnyOperationsAborted: BOOL;
hNameMappings: HWND;
lpszProgressTitle: PChar;
end;
const
FO_MOVE = $0001;
FO_COPY = $0002;
FOF_SILENT = $0004;
FOF_NOCONFIRMATION = $0010;
FOF_FILESONLY = $0080;
FOF_NOCONFIRMMKDIR = $0200;
function SHFileOperation(const lpFileOp: TSHFileOpStruct):Integer; external 'SHFileOperation@shell32.dll stdcall';
procedure BackupFile();
var
file, backFile, backpath: string;
begin
if FileExists(ExpandConstant(CurrentFileName)) then
begin
File := ExpandConstant(CurrentFileName);
backpath := file;
StringChangeEx(backpath, ExpandConstant('{app}'), '', True);
backFile := ExpandConstant('{app}\Backup') + backpath;
ForceDirectories(ExtractFilePath(backfile));
RenameFile(file, backfile);
end;
end;
function BackupDir(const fromDir, toDir: ansistring; IsMove: Boolean): Boolean;
var
fos: TSHFileOpStruct;
_fromDir, _toDir: ansistring;
SR: TFindRec;
res: Boolean;
begin
ForceDirectories(toDir);
if IsMove then
fos.wFunc := FO_MOVE else
fos.wFunc := FO_COPY;
fos.fFlags := FOF_FILESONLY or FOF_SILENT or
FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
_fromDir:= AddBackslash(fromDir);
_toDir := AddBackslash(toDir);
if (Length(fromDir) = Length(_fromDir)) then
begin
res:= FindFirst(_fromDir + '*', SR);
try
while res do
begin
if (SR.Name <> '') and (SR.Name <> '.') and (SR.Name <> '..') then
begin
if SR.Attributes = FILE_ATTRIBUTE_DIRECTORY then
begin
_fromDir:= _fromDir + SR.Name + #0#0;
_toDir := _toDir + #0#0;
fos.pFrom := PChar(_fromDir);
fos.pTo := PChar(_toDir);
end else
begin
_fromDir:= _fromDir + SR.Name + #0#0;
_toDir := _toDir + SR.Name + #0#0;
fos.pFrom := PChar(_fromDir);
fos.pTo := PChar(_toDir);
end;
Result := (0 = ShFileOperation(fos));
_fromDir:= ExtractFilePath(_fromDir);
_toDir:= ExtractFilePath(_toDir);
end;
res := FindNext(SR);
end;
finally
FindClose(SR);
end;
end else
begin
_fromDir:= RemoveBackslashUnlessRoot(_fromDir) + #0#0;
_toDir := RemoveBackslashUnlessRoot(_toDir) + #0#0;
fos.pFrom := PChar(_fromDir);
fos.pTo := PChar(_toDir);
Result := (0 = ShFileOperation(fos));
end;
end;
procedure RestoreBackup(backDir: string);
begin
BackupDir(backDir, ExpandConstant('{app}'), True);
DelTree(backDir, true, true, true);
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usdone then
begin
RestoreBackup(ExpandConstant('{app}\Backup\'));
end;
end;
vadjliss
07-02-2016, 09:07
как убрать но что бы по умолчанию ярлык устанавливался на рабочий стол
http://fs5.directupload.net/images/160207/temp/ruvjwpsa.jpg (http://fs5.directupload.net/images/160207/ruvjwpsa.jpg)
как убрать но что бы по умолчанию ярлык устанавливался на рабочий стол »
Удалите из секции [Tasks] задачу, отвечающую за создание ярлыка.
[Tasks]
Name: desktopicon; Description: "Создать значек на Рабочем столе"
Или полностью удалите секцию [Tasks] из скрипта, если в ней нет других задач.
Создание ярлыка в секции [Icons] оформите следующим образом:
[Icons]
;для всех пользователей
Name: "{commondesktop}\имя программы"; Filename: "{app}\имя файла.exe"; WorkingDir: "{app}";
;для текущего пользователя
Name: "{userdesktop}\имя программы"; Filename: "{app}\имя файла.exe"; WorkingDir: "{app}";
Более подробно можно почитать в справке.
vadjliss, Удалите:
[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
В секции [Icons] найдите похожую строку:
Name: {commondesktop}\My Program; Filename: {app}\MyProg.exe; Tasks: desktopicon
в содержимом найдите Tasks: desktopicon и удалите, т.е чтоб вместо
Name: {commondesktop}\My Program; Filename: {app}\MyProg.exe; Tasks: desktopicon
получилось
Name: {commondesktop}\My Program; Filename: {app}\MyProg.exe;
djbionicl
07-02-2016, 10:08
Введите в googl'e "Как отследить изменения в системе после установки программы?" »
Отследил, а как в инно сетап вставить?
Отследил, а как в инно сетап вставить? »Что вы отследили и чем?
Если вам нужно в скрипт импортировать содержимое реестра, то воспользуйтесь инструментом Converter: ссылка на сообщение есть в первом сообщении (http://forum.oszone.net/post-2465013-86.html) данной темы внутри спойлера "Дополнительные программы для Inno Setup". Если не увидели, вот вот (http://forum.oszone.net/post-1216149-86.html) прямая ссылка на сообщение #86.
Или используйте инструмент Inno Script Studio (https://www.kymoto.org/products/inno-script-studio/downloads).
Скачайте и установите Inno Script Studio.
Откройте скрипт с помощью Inno Script Studio.
Переместите курсор мыши на секцию "Registry/Реестр"
Нажмите по "Registry/Реестр".
Переместите reg-файл в пустую область.
Dodakaedr
07-02-2016, 11:24
С бэкапом небольшая загвоздка выходит. »
Не вижу никаких загвоздок. Все работает!
vadjliss
07-02-2016, 11:56
спасибо большое парни
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC