PDA

Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 8]


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 [114] 115 116 117 118 119 120 121 122 123 124 125 126

Iska
06-11-2017, 06:58
vk_k14m@vk, да, четвёртый параметр. Надо ж было мне так обсчитаться :(. Приношу Вам свои извинения.

Или не 0 а SW_HIDE? »
Если SW_HIDE равно 0, то можно :). Надо полагать, что так оно и есть. В любом случае всё сводится к функции WinAPI CreateProcess().

vk_k14m@vk
06-11-2017, 07:00
Iska, что ж буду проверять)

Nordek
06-11-2017, 10:07
В секции [Run] есть фалг runhidden. »
SW_HIDE
SW_SHOWNORMAL
SW_SHOWMINIMIZED
SW_SHOWMAXIMIZED
SW_SHOW
SW_SHOWMINNOACTIVE
Само за себя выдаёт: Вместо SW_SHOW задайте SW_HIDE.

R.i.m.s.k.y.
09-11-2017, 18:30
скажите, пожалуйста, можно ли как-то научить писать инно в ini через секцию ini в UTF8?
или как-то сконвертировать потом сформированный установщиком ниншник в utf8?

nik1967
11-11-2017, 07:20
R.i.m.s.k.y., а что, разве не сохраняет в UTF8?
http://i98.fastpic.ru/big/2017/1111/96/b037fa7193dfc69e78f91fc46607c096.png

Iska
11-11-2017, 08:02
nik1967, надо сохранение в UTF-8 создаваемого разделом [INI] инсталлятора ini-файла. Но дело в том, что WritePrivateProfileString()/GetPrivateProfileString() не работают с UTF-8. Ещё не существующий файл будет создаваться посредством WritePrivateProfileStringA() в ANSI/1251. Если предварительно создать искомый пустой ini-файл в UTF-16LE/1200 — будет использоваться WritePrivateProfileStringW(). Аналогично будет работать и при удалении. Но вот путей совместить раздел [INI] и UTF-8 я не вижу.

Можно попробовать оставить создание ini-файла из раздела [INI] как есть, а на заключительном этапе после установки просто взять и кодом прочитать содержимое файла, а затем посредством SaveStringsToUTF8File() перезаписать его. Для деинсталляции проделать обратное — на предварительном этапе прочитать UTF-8 и записать содержимое в ANSI, чтобы деинсталлятор смог отработать указанными выше функциями. Это, конечно, предварительные соображения, я их даже не проверял.

P.S. По поводу скриншота с примером: если в файле нет многобайтовых символов (например, той же кириллицы), то UTF-8 без BOM ничем не отличается от ANSI/1251.

El Sanchez
11-11-2017, 11:59
можно ли как-то научить писать инно в ini через секцию ini в UTF8? »
R.i.m.s.k.y.,

[INI]
Filename: "{src}\test.ini"; Section: "test"; Key: "test"; String: {code:UTF8Encode|this is чёрт знает что за うんこ}

[Code]
const
CP_ACP = 0;
CP_UTF8 = 65001;

// Unicode and Character Set Functions
function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: string; cchWideChar: Integer; lpMultiByteStr: AnsiString; cbMultiByte, lpDefaultChar: Integer; lpUsedDefaultChar: Longint): Integer; external 'WideCharToMultiByte@kernel32.dll stdcall';
function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: AnsiString; cbMultiByte: Integer; lpWideCharStr: string; cchWideChar: Integer): Integer; external 'MultiByteToWideChar@kernel32.dll stdcall';

/////////////////////////////////////////////////
function UTF8Encode(const Value: string): string;
var
Len: Integer;
UTF16Buffer: string;
UTF8Buffer: AnsiString;
begin
if Value = '' then Exit;
#ifndef UNICODE
Len := MultiByteToWideChar(CP_ACP, 0, Value, -1, '', 0);
if Len = 0 then Exit;
UTF16Buffer := StringOfChar(#0, Len shl 1);
if MultiByteToWideChar(CP_ACP, 0, Value, -1, UTF16Buffer, Len) = 0 then Exit;
#else
UTF16Buffer := Value;
#endif
Len := WideCharToMultiByte(CP_UTF8, 0, UTF16Buffer, -1, '', 0, 0, 0);
if Len = 0 then Exit;
UTF8Buffer := StringOfChar(#0, Len - 1);
if WideCharToMultiByte(CP_UTF8, 0, UTF16Buffer, -1, UTF8Buffer, Len, 0, 0) = 0 then Exit;
Result := UTF8Buffer;
end;

vk_k14m@vk
13-11-2017, 20:53
Как можно запускать приложение через секцию [Сode] с параметрами.

Например в секции [Run] все просто

[Run]
Filename: "{sys}\CMD.EXE"; WorkingDir: "{app}\data"; Parameters: /C RD /S /Q jg2e00_00_00

Я использую такой код
[Соde]
procedure unpack_this_file_xx();
var res:integer; file, path : string;
begin
file := ExpandConstant('{app}\data\Decrypt.bat'); path := ExpandConstant('{app}');
if FileExists(file) then Exec(file, 'параметры',path,SW_HIDE,ewWaitUntilTerminated,res) else MsgBox('Файл' + ' ' + file + #13#10 + 'не найден', mbInformation, MB_OK);
end;

Как я понял file в [Code] то же самое что Filename в [Run]. А path в [Code] как WorkingDir в [Run]. Значит к "var res:integer; file, path, " нужно написать что-то подобное для параметров?

***

И еще. Можно сделать еще одно окно с индикатором выполнения (https://www.google.com.ua/search?newwindow=1&biw=1280&bih=893&tbm=isch&sa=1&ei=IsELWsOMEIqyabzlufgH&q=%D0%98%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80+%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5% D0%BD%D0%B8%D1%8F&oq=%D0%98%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80+%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5 %D0%BD%D0%B8%D1%8F&gs_l=psy-ab.3..0j0i24k1l2.6046.10301.0.10500.20.20.0.0.0.0.100.1728.19j1.20.0....0...1.1.64.psy-ab..0.20.1716...0i67k1j0i30k1.0.t4-hd_26JSs)? У меня через секцию [Сode] запускается 101 приложение. И в [Run] еще 178. Хотелось бы наглядно видеть ход их выполнения...

pollipen
15-11-2017, 17:00
парни, проблема я отключил папку установки , но теперь не отображается дополнительные программы Microsoft Visual C++ может кто поправит

[Setup]
DisableWelcomePage=yes
DisableReadyPage=yes
DisableFinishedPage=yes
Compression=none
RestartIfNeededByRun=no
AppName=vbvb
AppVersion=5
CreateAppDir=False
[Files]
Source: "C:\Users\ww\Desktop\длполнение\W.bmp"; Flags: dontcopy

[Run]
Filename: {src}\Redist\vcredist_x86.exe; Parameters: /q; StatusMsg: Устанавливаем Microsoft Visual C++ 2005 Redist...; Flags: skipifdoesntexist; Check: MicrosoftVisualCheck

var
BitmapImage1: TBitmapImage;
Panel1: TPanel;
Reg: TLabel;
DopSoft: TNewCheckBox;

function MicrosoftVisualCheck: Boolean;
begin
Result := DopSoft.Checked;
end;

procedure InitializeWizard();
begin
WizardForm.ClientWidth:=ScaleX(500);
WizardForm.ClientHeight:=ScaleY(120);
WizardForm.Center;
WizardForm.OuterNotebook.Hide;
WizardForm.InnerNotebook.Hide;
WizardForm.Bevel.Hide;

BitmapImage1 := TBitmapImage.Create(WizardForm);
with BitmapImage1 do
begin
Parent := WizardForm;
Left := ScaleX(5);
Top := ScaleY(5);
Width := ScaleX(64);
Height := ScaleY(64);
ExtractTemporaryFile('W.bmp');
Bitmap.LoadFromFile(ExpandConstant('{tmp}\W.bmp'));
end;

Panel1 := TPanel.Create(WizardForm);
with Panel1 do
begin
Parent := WizardForm;
Left := ScaleX(80);
Top := ScaleY(20);
Width := ScaleX(320);
Height := ScaleY(40);
BorderStyle := bsSingle;
end;

with WizardForm.DirEdit do
begin
Top := ScaleY(8);
Left := ScaleX(5);
Parent := Panel1;
Width := ScaleX(285)
Color := clMenu;
BorderStyle := bsNone;
Font.Name := 'Times New Roman';
Font.Height := -16;
end;

Reg := TLabel.Create(WizardForm);
with Reg do
begin
Parent := WizardForm;
Caption := 'Зарегистрированная русская версия ';
Left := ScaleX(150);
Top := ScaleY(65);
Width := ScaleX(209);
Height := ScaleY(13);
end;

DopSoft := TNewCheckBox.Create(WizardForm);
with DopSoft do
begin
Parent := WizardForm;
Left := ScaleX(150);
Top := ScaleY(90);
Width := ScaleX(129);
Height := ScaleY(17);
Caption := 'Microsoft Visual C++';
Checked:=True;
end;

with WizardForm.NextButton do
begin
Left := ScaleX(405);
Top := ScaleY(20);
Width := ScaleX(90);
Height := ScaleY(40);
Font.Name := 'Times New Roman';
end;

with WizardForm.CancelButton do
begin
Left := ScaleX(405);
Top := ScaleY(20);
Width := ScaleX(90);
Height := ScaleY(40);
Font.Name := 'Times New Roman';
end;
with WizardForm.ProgressGauge do
begin
Top := ScaleY(20);
Left := ScaleX(80);
Width := ScaleX(320);
Height := ScaleY(40);
Parent := WizardForm;
end;
with WizardForm.StatusLabel do
begin
Left := ScaleX(80);
Top := ScaleY(70);
Parent := WizardForm;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
WizardForm.ProgressGauge.Hide;
Panel1.Hide;
Reg.Hide;
DopSoft.Hide;
WizardForm.StatusLabel.Hide;
case CurPageID of
wpSelectDir:
begin
Panel1.Show;
Reg.Show;
DopSoft.Show;
end;
wpInstalling:
begin
WizardForm.ProgressGauge.Show;
WizardForm.StatusLabel.Show;
end;
end;
end;

xryst
18-11-2017, 01:13
Может ли Inno Setup проверять наличие нужной папки перед установкой? и если ее нет, то завершать процесс установки.

Iska
18-11-2017, 01:28
Может. Что Вы подразумеваете под «нужной папкой»?

vk_k14m@vk
18-11-2017, 02:25
А меня уже принято игнорить?

R.i.m.s.k.y.
18-11-2017, 09:45
Значит к "var res:integer; file, path, " нужно написать что-то подобное для параметров? »
нет, это переменные
первое - целочисленное, используется для кода ошибок, второе - строковое, задаешь пути в них
Что не работает то?

vk_k14m@vk
18-11-2017, 12:09
нет, это переменные
первое - целочисленное, используется для кода ошибок, второе - строковое, задаешь пути в них
Что не работает то? »
Вот опять меня буд-то не понимают. Перечитайте еще раз мое сообщение. Медленно, не спеша. Если не поняли вопрос, перечитайте еще раз.

Nordek
18-11-2017, 13:50
Как можно запускать приложение через секцию [Сode] с параметрами. »
Вот опять меня буд-то не понимают. »

[Code]
var
IS_CP: TWizardPage;
B_1: TNewButton;
B_2: TNewButton;
ResultCode: Integer;

procedure B_1Click(Sender: TObject);
begin
Exec(ExpandConstant('{pf}\7-Zip\7zFM.exe'), '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);
end;

procedure B_2Click(Sender: TObject);
begin
Exec(ExpandConstant('{pf}\7-Zip\7zG.exe'), ExpandConstant('a -t7z -m0=LZMA2 -mmt=on -mx9 -md=64m -mfb=64 -ms=4g -mqs=on -bb0 -sccUTF-8 "-w{tmp}" "{userdesktop}\Default.7z" "{localappdata}\Google\Chrome\User Data\Default"'), '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);
end;

procedure app_7z;
begin
IS_CP := CreateCustomPage(wpWelcome, 'Caption', 'Description');

B_1 := TNewButton.Create(WizardForm);
with B_1 do
begin
Parent := IS_CP.Surface;
SetBounds(ScaleX(16), ScaleY(16), ScaleX(100), ScaleY(25));
Caption := 'Run 7-Zip';
OnClick := @B_1Click;
end;

B_2 := TNewButton.Create(WizardForm);
with B_2 do
begin
Parent := IS_CP.Surface;
SetBounds(ScaleX(16), ScaleY(48), ScaleX(100), ScaleY(25));
Caption := 'Create Backup';
OnClick := @B_2Click;
end;
end;

procedure InitializeWizard();
begin
app_7z;
end;

Вот опять меня буд-то не понимают. »Прикинь, в справке можно найти!?

ENERGES
26-11-2017, 16:39
как сделать такое окно https://s8.hostingkartinok.com/uploads/images/2017/11/b60ea90ee6308700314e3c531f517572.png
сам скрипт http://rgho.st/6HNm67hXF

TheLeon
29-11-2017, 19:04
Здравствуйте ещё раз, уважаемые администрация и пользователи OSZone.net. У меня появился опять вопрос, но так вот: как при установке заменить в файле(формата .img) какие-либо файлы(формата .txd и .dff), а файлы, которые заменяют, перенести в, созданную установщиком, папку-бэкап?

El Sanchez
30-11-2017, 10:29
как сделать такое окно »
web_form, GetOpenFileName (http://www.jrsoftware.org/ishelp/index.php?topic=isxfunc_getopenfilename)
как при установке заменить в файле(формата .img) какие-либо файлы(формата .txd и .dff), а файлы, которые заменяют, перенести в, созданную установщиком, папку-бэкап? »
TheLeon, для начала нужно найти консольную утилиту для работы с img-файлами.

ENERGES
30-11-2017, 11:45
El Sanchez, а как это прописать в скрипте?

El Sanchez
30-11-2017, 15:33
а как это прописать в скрипте? »
web_form, место в скрипте найдете по комментарию

// далее находятся закомментированые примеры различных функций распаковки (чтобы каждый раз не лазить в справку за примерами)
FileName := ExpandConstant('{src}\data1.bin');
if not FileExists(FileName) then
GetOpenFileName('Открытие', FileName, ExpandConstant('{src}'), 'Arc files (data*.bin)|*.bin|All Files|*.*', 'bin');
if not ISARCExtract(0, 100, FileName, ExpandConstant('{app}'), '', False, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then Break;




© OSzone.net 2001-2012