PDA

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


Страниц : 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

Dodakaedr
30-04-2019, 18:46
Эмм, что-то у меня это равенство ни при каких условиях не выполняется, хоть есть нестандартные символы, хоть нет. »
На какой символ проверяете?
Я ещё отдельно выставил 2 разные переменные в первой и второй проверке »
они не могли испортить функцию?
Попробуйте еще так:

[Setup]
AppName=App
AppverName=App v1.0
DefaultDirName={pf}\App
OutputDir=.

[Code]
var
errorcode: integer;

function IsAnsiOrSym(S: String; var ResultError: integer): Boolean;
var
n: string;
i,j: integer;
begin
if CompareStr(AnsiUppercase(S), Uppercase(S)) = 0 then
if CompareStr(Lowercase(S), AnsiLowercase(S)) = 0 then Result := True else Result := False;
if not result then ResultError := 1;
if result then
begin
n := '!"@#$%^&*';
for i:=1 to length(s) do
for j:=1 to length(n) do
begin
if s[i] = n[j] then
begin
Result := False;
ResultError := 2;
exit;
end;
end;
end;
end;

procedure InitializeWizard();
begin
if not (IsAnsiOrSym(ExpandConstant('{src}'), errorcode)) then if (errorcode=1) then MsgBox('Найдена кириллица в: '+ExpandConstant('{src}'),mbError,MB_OK);
if not (IsAnsiOrSym(ExpandConstant('{src}'), errorcode)) then if (errorcode=2) then MsgBox('Найден спецсимвол в: '+ExpandConstant('{src}'),mbError,MB_OK);
end;

ErikPshat
30-04-2019, 20:50
На какой символ проверяете?
они не могли испортить функцию? »
Вполне может быть я что-то не так подхимичил. Вроде бы по логике всё так же должно было остаться.
Я разделил ту функцию на 2 отдельные функции. Ну там переменную "n" поменял на "m", т.к. первая у меня уже используется в коде.
function IsAnsi(S: String): Boolean;
begin if CompareStr(AnsiUppercase(S), Uppercase(S)) = 0 then
begin if CompareStr(Lowercase(S), AnsiLowercase(S)) = 0 then Result := True; end; end;

function IsSymb(S: String): Boolean; var m: String; i, j: Integer;
begin
m := '!"@#$%^&*';
for i:=1 to length(S) do
for j:=1 to length(m) do
begin if S[i] = m[j] then Result := False; end;
end;

procedure InitializeWizard();
if not(IsAnsi(ExpandConstant('{src}'))) then begin MsgBox(ExpandConstant('{cm:CirillicPATH}')+#10#10+ExpandConstant('{src}'), mbError, MB_OK);Exit;end;
if not(IsSymb(ExpandConstant('{src}'))) then begin MsgBox(ExpandConstant('{cm:SimbolsPATH}')+#10#10+ExpandConstant('{src}'), mbError, MB_OK);Exit;end;

Проверил ваш код. Всё отлично работает! Из функции exit; перенёс в исполняемый код, т.к. мне нужно, чтобы после оповещения, окно закрывалось и прекращало работу.
Спасибо большое!!!

vk_k14m@vk
08-06-2019, 20:28
Народ, у меня вопрос по секции [UninstallDelete]. При удалении приложения нужно так же удалять конфиг приложения. Но можно ли сделать, что б уинсталлер просил подтверждение при удалении?

Dodakaedr
08-06-2019, 21:58
можно ли сделать, что б уинсталлер просил подтверждение при удалении? »

[Setup]
AppName=App
AppverName=App v1.0
DefaultDirName={pf}\App
OutputDir=.

[Code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then
if MsgBox('Также удалить настройки программы?', mbConfirmation, MB_YESNO)=IDYES then DeleteFile(ExpandConstant('{commonappdata}\Proga\config.cfg'));
end;

Iska
08-06-2019, 22:56
Dodakaedr, лучше бы вопрос задавался в самом начале процесса деинсталляции, а не в конце (если я правильно понял логику кода).

vk_k14m@vk
08-06-2019, 23:30
лучше бы вопрос задавался в самом начале процесса деинсталляции, а не в конце (если я правильно понял логику кода). »
Мне нужно что б удалилось само приложение, и в конце деинсталлер уточнял, удалять ли и конфиг тоже. Или оставить...

И наверно нужно было уточнять, что конфиг не один а несколько. И достоверно известна только папка в которой они находятся, но не их названия...

Изменил код на как мне казалось рабочий вариант.
[Code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then
if MsgBox('Также удалить настройки программы?', mbConfirmation, MB_YESNO)=IDYES then DelTree('{app}\config', True, True, True);
end;
Но нет. Установщик спросил удалять или нет, и при согласии файлы остались на месте. Что я сделал не так?

Dodakaedr
08-06-2019, 23:49
И наверно нужно было уточнять, что конфиг не один а несколько »
Уточняйте все и сразу: какого рода ваши конфиги, маска файлов подойдет?

лучше бы вопрос задавался в самом начале процесса деинсталляции »
Если пользователь удаляет прогу, то ему, я думаю, все равно где задавать вопрос.

И судя по ответу
Мне нужно что б удалилось само приложение, и в конце деинсталлер уточнял »
я предоставил пример что требовалось. И сейчас будем пол страницы узнавать подробности конфигов.

Iska
09-06-2019, 00:46
Если пользователь удаляет прогу, то ему, я думаю, все равно где задавать вопрос. »
Сугубо с точки зрения эргономики — в начале, ибо в противном случае на мелких (по количеству файлов) инсталляциях навряд ли время под процесс основной деинсталляции будет особо продолжительным, а вот на крупных — данная пауза будет заметно раздражать.

И судя по ответу я предоставил пример что требовалось. И сейчас будем пол страницы узнавать подробности конфигов. »
Ну, это как обычно ;).

vk_k14m@vk
09-06-2019, 00:51
Уточняйте все и сразу: какого рода ваши конфиги, маска файлов подойдет? »
3 маски нужно. Там конфиги трех разных расширений...

Dodakaedr
09-06-2019, 07:56
Что я сделал не так? »
Указали не правильную константу.

vk_k14m@vk
09-06-2019, 17:41
Указали не правильную константу. »
Ясно...

vk_k14m@vk
12-06-2019, 20:04
Народ. Есть игра, в корне которой лежит текстовый файл config.ksc, с текстом
(const) %[
"saveDataLocation" => "file://./d/документы/fateavedata"
]
d/документы/fateavedata - это папка в которую игра будет сохранятся.

Так вот как бы настроить создание этого файла в установщике?

Нужно что б на странице выбора папки установки игры, или на следующей после этой странице можно было выбрать путь к папке сохранения (и создание этой папки если ее нет). И после завершения установки этот путь должен прописаться в файле config.ksc

Как бы это провернуть? Надеюсь на вашу помощь...

El Sanchez
13-06-2019, 16:20
Так вот как бы настроить создание этого файла в установщике? »

[Code]
procedure RtlMoveMemory(Dest: PAnsiChar; Source: string; Len: Integer); external 'RtlMoveMemory@kernel32.dll stdcall';

var
SaveDataLocationPage: TInputDirWizardPage;

procedure SetSaveDataLocation;
var
S1: string;
S2: AnsiString;
begin
S1 := SaveDataLocationPage.Values[0];
StringChangeEx(S1, ':', '', True);
StringChangeEx(S1, '\', '/', True);
S1 := '%["saveDataLocation" => "file://./' + S1 + '"]';
S2 := StringOfChar(#0, Length(S1) shl 1);
RtlMoveMemory(S2, S1, Length(S2));
S2 := Chr($FF) + Chr($FE) + S2;
SaveStringToFile(ExpandConstant(CurrentFileName), S2, False);
end;

procedure CreateSaveDataLocationPage;
begin
SaveDataLocationPage := CreateInputDirPage(wpSelectDir, 'caption', 'description', 'subcaption', False, 'fateavedata');
SaveDataLocationPage.Add('prompt');
end;

procedure InitializeWizard;
begin
CreateSaveDataLocationPage;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
case CurPageID of
SaveDataLocationPage.ID:
if SaveDataLocationPage.Values[0] = '' then
SaveDataLocationPage.Values[0] := ExpandConstant('{app}\fateavedata');
end;
end;

Dodakaedr
13-06-2019, 19:32
S2 := Chr($FF) + Chr($FE) + S2; »
А какие начальные байты у ANSI?

Iska
13-06-2019, 20:53
Dodakaedr, никаких. Для ANSI и OEM нет BOM.

vk_k14m@vk
14-06-2019, 00:13
El Sanchez, к сожалению твой код не работает. Или правильнее будет сказать, работает не до конца. Страница в выбором папки установки и правда появилась.
https://i106.fastpic.ru/big/2019/0614/c8/c4d490c4a4b56075679674eabf7dd4c8.png

Вот только файл config.ksc с текстом(const) %[
"saveDataLocation" => "file://./{app}\fateavedata"
]в папке с игрой не появляется. Может я что-то не так сделал?
; Скрипт создан при помощи мастера создания скриптов.
; СМ. ДОКУМЕНТАЦИЮ ДЛЯ ИЗУЧЕНИЯ ДЕТАЛЕЙ ОТНОСИТЕЛЬНО СОЗДАНИЯ ФАЙЛОВ СКРИПТА INNO SETUP!

#define MyAppName "Fate/Stay Night [Realta Nua] - Ultimate Edition"
#define MyAppVerName "Fate/Stay Night [Realta Nua] - Ultimate Edition v0.9.1"
#define MyAppPublisher "Type-Moon"
#define MyAppExeName "Fate.exe"

[Setup]
AppName={#MyAppName}
AppVerName={#MyAppVerName}
AppPublisher={#MyAppPublisher}
DefaultDirName=D:\Games\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputDir=D:\
OutputBaseFilename=setup
DisableWelcomePage=no
SetupIconFile=D:\Fate/Stay Night [Realta Nua] - Ultimate Edition\icon.ico
WizardImageFile=D:\Fate/Stay night\WizardImageFile.bmp
WizardSmallImageFile=D:\Fate/Stay night\WizardSmallImageFile.bmp
Compression=lzma/ultra64
SolidCompression=yes
DiskSpanning=yes
DiskSliceSize=1073741824

[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "D:\Fate/Stay Night [Realta Nua] - Ultimate Edition\Fate.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Fate/Stay Night [Realta Nua] - Ultimate Edition\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; ОТМЕТЬТЕ: Не используйте "Флажки: Проигнорировать версию" на любых общедоступных системных файлах

[Code ]
procedure RtlMoveMemory(Dest: PAnsiChar; Source: string; Len: Integer); external 'RtlMoveMemory@kernel32.dll stdcall';

var
SaveDataLocationPage: TInputDirWizardPage;

procedure SetSaveDataLocation;
var
S1: string;
S2: AnsiString;
begin
S1 := SaveDataLocationPage.Values[0];
StringChangeEx(S1, ':', '', True);
StringChangeEx(S1, '\', '/', True);
S1 := '%["saveDataLocation" => "file://./' + S1 + '"]';
S2 := StringOfChar(#0, Length(S1) shl 1);
RtlMoveMemory(S2, S1, Length(S2));
S2 := Chr($FF) + Chr($FE) + S2;
SaveStringToFile(ExpandConstant(CurrentFileName), S2, False);
end;

procedure CreateSaveDataLocationPage;
begin
SaveDataLocationPage := CreateInputDirPage(wpSelectDir, 'Выбор папки сохранений', 'В какую папку должна сохраняться игра Fate/Stay Night [Realta Nua] - Ultimate Edition?', 'Программа настроит сохранения игры Fate/Stay Night [Realta Nua] - Ultimate Edition в следующую папку.', False, 'fateavedata');
SaveDataLocationPage.Add('Нажмите «Далее», что бы продолжить. Если вы хотите выбрать другую папку, нажмите «Обзор».');
end;

procedure InitializeWizard;
begin
CreateSaveDataLocationPage;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
case CurPageID of
SaveDataLocationPage.ID:
if SaveDataLocationPage.Values[0] = '' then
SaveDataLocationPage.Values[0] := ExpandConstant('{app}\fateavedata');
end;
end;

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon

[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: nowait postinstall skipifsilent



А еще, можно как то разобрать уже созданный установщик что б узнать исходный код? Я не знаю в какой программе он был создан, но очень бы хотелось его разобрать...

ErikPshat
14-06-2019, 01:01
vk_k14m@vk, ну свою прогу вы можете распаковать этим: Inno Setup Unpacker (https://sourceforge.net/projects/innounp/)
Секцию Code вы конечно не дизассемблируете, т.к. она в бинарном виде изначально будет упакована, но всё остальное прекрасно извлекается.
А вот надо сначала узнать, в какой программе был создан экзешник, потом извлекать соответствующим софтом.

vk_k14m@vk
14-06-2019, 01:04
ну свою прогу вы можете распаковать этим: Inno Setup Unpacker
Секцию Code вы конечно не дизассемблируете, т.к. она в бинарном виде изначально будет упакована, но всё остальное прекрасно извлекается.
А вот надо сначала узнать, в какой программе был создан экзешник, потом извлекать соответствующим софтом. »
Жаль. Тот установщик который я хочу распаковать не содержит в себе файлов. Он качает их откуда-то в интернете. Так что скорее всего мне именно секция Code и нужна.

А можно как то узнать в какой программе был создан установщик?

ErikPshat
14-06-2019, 01:33
А можно как то узнать в какой программе был создан установщик? »
Вот вам список прог в помощь: PEiD (https://yadi.sk/d/-XZgMNergLY4Uw), DiE (http://ntinfo.biz/index.html) (Detect It Easy), Bit Detector, SCANiT (https://yadi.sk/d/LO7HNcRDp-FGMg), ExeScan, FastScanner (https://yadi.sk/d/-Ep6-x9GDtS4YA) и PE Tools
Ну или вот вам пару ресурсов:

https://exelab.ru/download.php
http://www.manhunter.ru/underground/94_programmi_dlya_analiza_ispolnyaemih_faylov.html

El Sanchez
14-06-2019, 09:54
Вот только файл config.ksc с текстом в папке с игрой не появляется. Может я что-то не так сделал? »
vk_k14m@vk, ой, не все скопировал у себя, когда пост оформлял. Добавить в [Files] пустышку config.ksc:
[Files]
Source: config.ksc; DestDir: {app}; AfterInstall: SetSaveDataLocation




© OSzone.net 2001-2012