PDA

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


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

DemonAk
05-06-2009, 01:53
Попробуйте эту версию. »
Скопировал вот это InnoSetup FullVCL и заробило.
чуть позже выложу пример... »
С нетерпением жду)

semiono
05-06-2009, 12:17
Из этого получается, что {break} - шесть нолей... »
Serega_, break наверное шесть, я имел ввиду что через
invoke MoveFileEx,lpExistingFileName1,NULL,MOVEFILE_DELAY_UNTIL_REBOOT
пять получалось, хотя надо посчитать, я только за комп сел :)
Правда мне кажется там суть такова, что один байт "00" это конец строки или закрытие строки,
а "00 00 00 00" это новая пустая строка или NULL кароче то чем "затирает", может она и длинее даже...

semiono
05-06-2009, 15:44
Даже сейчас с уверенностью сказать трудно, но этот брейк даёт четыре нуля '00 00'
Root: HKLM; Subkey: "Software\ax"; ValueType: multisz; ValueName: "a"; ValueData: "{break}."; Flags: noerror; Permissions: admins-full
Дело в том, как я понял, что там юникод типа, и каждый символ записывается как два байта, отсюда запись точки скажем будет 2E 00, вот это и путает.

semiono
05-06-2009, 18:58
Вот этот код работает, даже если его поделить на два инсталлера и частями запускать
[Registry]
; PendingFileRenameOperations
Root: HKLM; Subkey: "System\ControlSet001\Control\Session Manager"; ValueType: multisz; ValueName: "PendingFileRenameOperations"; ValueData: "{olddata}\??\{sd}\ax{break}\??\{sd}\xb"; Flags: noerror; Permissions: admins-full
Root: HKLM; Subkey: "System\ControlSet001\Control\Session Manager"; ValueType: multisz; ValueName: "PendingFileRenameOperations"; ValueData: "{olddata}\??\{sd}\bx{break}\??\{sd}\xa"; Flags: noerror; Permissions: admins-full

[Files]
Source: "ax"; DestDir: "{sd}"; Flags: ignoreversion overwritereadonly touch; Permissions: admins-full
Source: "bx"; DestDir: "{sd}"; Flags: ignoreversion overwritereadonly touch; Permissions: admins-full

Причём даже {break} в конце строк не нужен. И даже это '!' не надо,
я вообще подозревал ещё раньше что это какая то опция а не указатель на target, ещёб узнать её значение!?
Однако, проблем опять не убавилось :)
Так как суперзадачей стоит заменить shell32.dll, то как оказалось его даже restartreplace стандартный флаг
не способен потянуть. Сразу же возникает предположение, что уж что а shell32.dll видимо грузится очень рано и уже просто невозможно бывает его заменять. Придётся вернуться к старым методам переименования
до перезагрузки, хотя там я так и не выяснил точный синтакс.
Кстати, я точно установил, что {break} в конце строки безполезен, то ли его инно игнорирует то ли реестр,
хоть десять бряков записать в реестре строка будет закрыта всегда как "00 00 00", если только она не последняя. Поэтому у меня там брейки вначале стояли, так как сначала строки они почему-то не игнорируются.
Там вообще загадок много, например, если я програмно из ассемлера пытался писать без
преффикса \\?\ который сам превращается потом в \??\ то без него вообще лажа получается - путь лезет прямо
от папки исходника, вот дурь!

ЗЫ я ещё не надоел тут с этим своим PendingFileRenameOperations :) ?

Serega
05-06-2009, 19:27
С нетерпением жду) »
Извиняюсь, только добрался до компьютера...

Вот этот код работает, даже если его поделить на два инсталлера и частями запускать »
Ну, что здесь сказать, водимо {olddata} заставляет инсталлятор добавлять перевод строки если его там нет...
Кстати, я точно установил, что {break} в конце строки безполезен, то ли его инно игнорирует то ли реестр,
хоть десять бряков записать в реестре будет строка закрыта как "00 00 00" всегда, если только она не последняя. »
неправда, Inno игнорирует по-моему больше пятнадцати {break} и в все они заносятся в реестр, плюс добавляется, это видно после экспорта из реестра, в конец ключа ещё 00,00
я ещё не надоел тут с этим своим PendingFileRenameOperations »
Не переживайте...

grinda
07-06-2009, 15:19
скажите, а есть ли запаковщик setup'а, чтоб заново не компилировать, а директорию или ярлык в скрипте поправить.

Serega
07-06-2009, 17:11
а есть ли запаковщик setup'а, чтоб заново не компилировать, а директорию или ярлык в скрипте поправить. »
только компилировать заново или использовать параметры командной строки инсталлятора, чтоб не распаковывать.

Krekerpro
07-06-2009, 21:40
Может ктонить дать скрипт для распаковки архива free arc'a?

Kutsenko Andriy
08-06-2009, 12:48
Заметил такую штуку в инсталах от InstallShield: когда нажимеш на кнопку отмена на любой странице установки и отвечаеш "Да" то появляется вот такая страничка:
http://s55.radikal.ru/i150/0905/ff/58d26d21c608.jpg
Кто знает как такое можна сделать в Inno Setup'e??? Заранее Спасибо!

semiono
08-06-2009, 13:30
насколько понял это надо дополнительную страницу самому нарисовать? и связать её с [tasks] секцией?
что-то вроде этого, только с другими константами...
[C0de]
var DataDirPage: TInputDirWizardPage;

procedure InitializeWizard;
begin
DataDirPage := CreateInputDirPage(wpSelectTasks, 'External...',
'1,43 GB (1*545*427*804 bytes)',
'Sounds files will be stored:',
False, 'New Folder');
DataDirPage.Add('Location:');
DataDirPage.Values[0] := ExpandConstant('{reg:HKLM32\Software\VST,VSTPluginsPath|{sd}}\RMIV');
end;

function GetDataDir(Param: String): String;
begin
Result := DataDirPage.Values[0];
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
if PageID = DataDirPage.ID {wpSelectTasks} then
begin
if IsTaskSelected('External') then Result := false
else Result := true;
end
else {wpPreparing} Result := false;
end;
CreateInputDirPage надо зделать под Cancel Page наверное...

неправда, Inno игнорирует по-моему больше пятнадцати {break} и в все они заносятся в реестр, плюс добавляется, это видно после экспорта из реестра, в конец ключа ещё 00,00 »
я нули считал между концом и началом строк "путей файлов на удаление" прямо в реестре нажав 'Modify binary data',
так как там немного было и легко сосчитать на глаз, поэтому export я не делал.
Десять дел делаю одновременно, поэтому уже трудно вернуться уточнить =)

Kutsenko Andriy
08-06-2009, 13:50
CreateInputDirPage надо зделать под Cancel Page наверное... »
А как это сделать? У меня просто знаний на такое нехватит(, вот я к вам и обращаюсь.
насколько понял это надо дополнительную страницу самому нарисовать? »
Именно это мне и нада!

Serega
08-06-2009, 22:35
Здравствуйте, исправил скрипт (http://www.forum.oszone.ru/post-1110723-676.html) распаковки FreeArc архивов...
Теперь используются внешние архивы, без копирования в папку приложения.

sanya007
08-06-2009, 23:23
Serega,

Я не много по другому создал батник, и не пришлось ничего прописывать в procedure CurStepChanged

procedure BatRunArc(s: string);
var
bat, a, b, str: string;
res: Integer;
begin
bat := ExpandConstant('{tmp}\RunArc.bat'); /// путь откуда запускается батник
a:=ExpandConstant('{src}') //// Назначаем путь для переменной "A"
b:=ExpandConstant('{app}') //// Назначаем путь для переменной "B"
str := str + '@echo off' + #10#13 +
str + 'Arc x "' + a + '" -y -s2 -dp"' + b + '" >in_log' + #10#13 + /// Распаковка из переменной "A" в переменную "B"
str + 'del ' + '"' + bat + '"'; //// Батник убивает сам себя
SaveStringToFile(bat, str, False);
Exec(bat, '', '', SW_HIDE, ewNoWait, res); //// Прячем выполнение батника от "Посторонних глаз"
end;

Serega
08-06-2009, 23:37
Я не много по другому создал батник »
здесь уж на любителя... :)
Самое главное - результат, а пути достижения могут быть разные...

DemonAk
08-06-2009, 23:43
Здравствуйте, исправил скрипт распаковки FreeArc архивов...
Теперь используются внешние архивы, без копирования в папку приложения. »
Огромная благодарность, все отлично работает :yahoo: :up

Krekerpro
09-06-2009, 00:02
А что надо в батнике прописать?

Serega
09-06-2009, 00:26
А что надо в батнике прописать? »
Там уже всё прописано, а менять нужно здесь:

...................................
procedure CurStepChanged(CurStep: TSetupStep);
begin
If CurStep = ssPostInstall then begin
patch_Arc:= ExpandConstant('"{src}\Arc.exe"'); // расположение Arc.exe
UnpackArc(ExpandConstant('"{src}\Project.arc"'), // расположение архива
ExpandConstant('"{app}"')); // место распаковки архива
end;
end;
.................................

Krekerpro
09-06-2009, 00:32
Serega,
При попытки компиляции выявляет ошибку: http://clip2net.com/clip/m0/1244493206-clip-47kb.png

Serega
09-06-2009, 00:43
При попытки компиляции выявляет ошибку »
Скрипт покажите...

Krekerpro
09-06-2009, 00:46
Serega,
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=D:\123
Compression=lzma/ultra
SolidCompression=yes
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl

[Files]

Source: C:\Program Files\FreeArc\bin\Arc.exe; DestDir: {app}; Flags: ignoreversion
Source: C:\DirectX.arc; DestDir: {app}; Afterinstall: UnpackArc('DirectX.arc'); Flags: ignoreversion skipifsourcedoesntexist



[UninstallDelete]
Name: {app}; Type: filesandordirs

[code]
var
ProgressLabel: TLabel;
ProgressBar: TNewProgressBar;
patch_Arc: string;

procedure ParserLog;
var
in_File, out_File, S, S1, S2: string;
i, j, n: Integer;
begin
in_File := ExpandConstant('{tmp}\in_log');
out_File := ExpandConstant('{tmp}\out_log');
ProgressBar.Show;
ProgressLabel.Show;
// если файла нет, то подождём... ;)
if FileExists(in_File) = False then
repeat
Application.ProcessMessages; // необходима расширенная версия от Restools
n:= n + 1;
Sleep(500); // ждём полсекунды и повторяем цикл
until (FileExists(in_File) = True) or (n = 10); // максимально повторяем цикл 10 раз, что составит 5 секунд...
// если всё же файла нет, то выходим
if FileExists(in_File) = False then Exit;
// если файл существует, то обробатываем его
repeat
FileCopy(in_File, out_File, False); // копирум файл, чтоб можно было открыть out_File для чтения
LoadStringFromFile(out_File, S); // если попытаться загрузить in_File, то ничего не выйдет, пока в него пишет Arc.exe...
Application.ProcessMessages; // необходима расширенная версия от Restools
if Pos('%', S) > 0 then begin
S1:= Copy(S, Length(S) - 4, (Length(S) - 2) - (Length(S) - 4));
S2:= Copy(S, Length(S) - 4, Length(S) - (Length(S) - 5));
StringChange(S1, ' ', ''); // удаляем пробелы
for i:= 0 to 100 do if S1 = IntToStr(i) then begin
j:= StrToInt(S1);
ProgressBar.Position := j;
StringChange(S2, ' ', '');
ProgressLabel.Caption:= S2;
Application.ProcessMessages; // необходима расширенная версия от Restools
end;
end;
until (Pos('Extracted', S) or Pos('ERROR', S)) > 0;
end;

procedure RunArc(s, patch: string);
var
bat, str: string;
res: Integer;
begin
bat := ExpandConstant('{tmp}\RunArc.bat');
str := '@echo off' + #10#13 +
patch_Arc +
' x ' + s + ' -y -s2 -dp' + // ключи распаковки архива
patch +
' >' + ExpandConstant('"{tmp}\in_log"') + #10#13 +
'del "' + bat + '"';
SaveStringToFile(bat, str, False);
Exec(bat, '', '', SW_HIDE, ewNoWait, res);
end;

procedure UnpackArc(s, patch: string);
begin
WizardForm.CancelButton.Enabled:= False; // отключаем кнопку 'Отмена'
// создаём батник для запуска Arc.exe... незнаю почему, но без батника, не хочет работать Arc.exe ;)
RunArc(s, patch);
WizardForm.StatusLabel.Caption:= 'Распаковка архива ' + ExtractFileName(s) + ', ждите...';
ParserLog; // обрабатываем лог файл
WizardForm.StatusLabel.Caption:= WizardForm.StatusLabel.Caption;
ProgressBar.Position := 100;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
If CurStep = ssPostInstall then begin
patch_Arc:= ExpandConstant('"{src}\Arc.exe"'); // расположение Arc.exe
UnpackArc(ExpandConstant('"{src}\Project.arc"'), // расположение архива
ExpandConstant('"{app}"')); // место распаковки архива
end;
end;

procedure InitializeWizard;
begin
// второй прогрессбар
ProgressBar := TNewProgressBar.Create(WizardForm);
with ProgressBar do begin
Left := WizardForm.ProgressGauge.Left;
Top := WizardForm.ProgressGauge.Top + ScaleX(30);
Width := WizardForm.ProgressGauge.Width;
Height := WizardForm.ProgressGauge.Height;
Parent := WizardForm.InstallingPage;
Position := 0;
Hide;
end;
// создаём Label для отображения процентов
ProgressLabel := TLabel.Create(WizardForm);
with ProgressLabel do begin
Left := ProgressBar.Left;
Top := ProgressBar.Top + ProgressBar.Height + ScaleX(5);
AutoSize:= True;
Caption:= '0%';
Parent := WizardForm.InstallingPage;
Transparent:= True;
Font.Color:= clDefault;
Hide;
end;
end;




© OSzone.net 2001-2012