Inno Setup. Сделайте за меня

Статус
В этой теме нельзя размещать новые ответы.

sergey3695

Ветеран
Модератор
Djinn, скачиваешь ботву, в папке модулей b2p.iss (или botva.iss) сами функции и подробное описание их использования.
И как написал urban, примеры там не зря даны :)
 

audiofeel

Старожил
Привет всем, такая вот небольшая проблема у меня. "акеловская" игра "Alone In The Dark", пользователь ее устанавливает, и по умолчанию разрешение у нее 800х600 ну естественно пользователь выставляет разрешение "родное" максимальное и перезапускает игру, но вот сволочь, она или не сохраняет настройки или запускает "как надо" но потом сама же их резко сбрасывает. решение вроде бы наидено - это оставить "готовый " фаил (в папке с сохранками) с родным разрешением монитора пользователя, ну свое то я пропишу, а как быть если оно и близко к моему не подходит
-----------------------------------------
ResolutionWidth = 1366
ResolutionHeight = 0768
NewResolution = 0
PrevResolutionWidth = 0800
PrevResolutionHeight = 0600
----------------------------------------
вот именно с такими данными игра идет норм (у меня), как записывать данные текст. мне показывали на Oszone, это я попробую найти а вот откуда взять инфу родного максимального разрешения монитора , от туда куда будет установленна игра я не знаю, знающие просьба помочь

пфф, вроде все
 

nik1967

Old Men
Проверенный
audiofeel, я брал
[SOURCE="inno"][Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

Код:
function GetDC(HWND: DWord): DWord; external 'GetDC@user32.dll stdcall';
function GetDeviceCaps(DC: DWord; Index: Integer): Integer; external 'GetDeviceCaps@gdi32.dll stdcall';
function ReleaseDC(HWND: DWord;DC: DWord): Integer; external 'ReleaseDC@user32.dll stdcall';

function GetMonitorInfo(MetricType:Byte;Descriptor:THandle): Word;
var
  dc: DWord;
begin
  Result:= 0;
  case MetricType of
    1:  /// разрешение по ширине
    begin
      dc:= GetDC(Descriptor);
      Result:= GetDeviceCaps(dc,8);
    end;
    2: /// разрешение по высоте
    begin
      dc:= GetDC(Descriptor);
      Result:= GetDeviceCaps(dc,10);
    end;
   end;
  ReleaseDC(Descriptor,dc);
end;

procedure InitializeWizard();
begin
  MsgBox('Разрешение монитора: ' + IntToStr(GetMonitorInfo(1,MainForm.Handle)) + ' x ' + IntToStr(GetMonitorInfo(2,MainForm.Handle)), mbConfirmation, MB_OK);
end;[/SOURCE][/SPOILER] (да простит меня автор, не помню чей) за основу и затем прописывал значения в .ini файле.
 

audiofeel

Старожил
nik1967,
да - разрешение "узнает" и пишет верное
хотелось бы, что бы кто нибудь проверил
=====================
_[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Dirs]
Name: {localappdata}\Atari\AITD; Flags: uninsneveruninstall;


_
Код:
function GetDC(HWND: DWord): DWord; external 'GetDC@user32.dll stdcall';
function GetDeviceCaps(DC: DWord; Index: Integer): Integer; external 'GetDeviceCaps@gdi32.dll stdcall';
function ReleaseDC(HWND: DWord;DC: DWord): Integer; external 'ReleaseDC@user32.dll stdcall';

function GetMonitorInfo(MetricType:Byte;Descriptor:THandle)  : Word;
var
  dc: DWord;
begin
  Result:= 0;
  case MetricType of
    1:  ///ðàçðåøåíèå ïî øèðèíå
    begin
      dc:= GetDC(Descriptor);
      Result:= GetDeviceCaps(dc,8);
    end;
    2: /// ðàçðåøåíèå ïî âûñîòå
    begin
      dc:= GetDC(Descriptor);
      Result:= GetDeviceCaps(dc,10);
    end;
   end;
  ReleaseDC(Descriptor,dc);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  If CurStep = ssPostInstall then begin
     SaveStringToFile(ExpandConstant('{localappdata}\Atari\AITD')+'\res.aitd', 'ResolutionWidth = ' + IntToStr(GetMonitorInfo(1,MainForm.Handle)) + #13#10, true);
     SaveStringToFile(ExpandConstant('{localappdata}\Atari\AITD')+'\res.aitd', 'ResolutionHeight = ' + IntToStr(GetMonitorInfo(2,MainForm.Handle)) + #13#10, true);
     SaveStringToFile(ExpandConstant('{localappdata}\Atari\AITD')+'\res.aitd', 'NewResolution = 0' + #13#10, true);
     SaveStringToFile(ExpandConstant('{localappdata}\Atari\AITD')+'\res.aitd', 'PrevResolutionWidth = 0800' + #13#10, true);
     SaveStringToFile(ExpandConstant('{localappdata}\Atari\AITD')+'\res.aitd', 'PrevResolutionHeight = 0600', true);
  end;
end;



//procedure InitializeWizard();
//begin
//  MsgBox('Ðàçðåøåíèå ìîíèòîðà: ' + IntToStr(GetMonitorInfo(1,MainForm.Handle)) + ' x ' + IntToStr(GetMonitorInfo(2,MainForm.Handle)), mbConfirmation, MB_OK);
//end;
[/spoiler]
 
Последнее редактирование:

vint56

Ветеран
Проверенный
audiofeel localappdata}\Atari\AITD')+'\res.aitd создаёт файл с таким содержанием
ResolutionWidth = 1920
ResolutionHeight = 1080
NewResolution = 0
PrevResolutionWidth = 0800
PrevResolutionHeight = 0600
 

audiofeel

Старожил
всем привет, решил воспользоватся первый раз = #define PackZIP
не удаляется папка 1
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\test.arc'), ExpandConstant('{app}\1'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
if not ISPackZIP ( 0, 0, ExpandConstant('{app}\1\*'), ExpandConstant('{app}\Game\GameData.pak'), 4, true ) then break;
------------------------------
не могу понять - почему??? помогите кто пользовался
 

Mickey1s

Ветеран
Модератор
Код:
if not ISPackZIP ( 0, 0, ExpandConstant('{app}[B]\Game\[/B]1\*'), ExpandConstant('{app}\Game\GameData.pak'), 4, true ) then break;
 

audiofeel

Старожил
Mickey1s,
"переделал" =
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\test.arc'), ExpandConstant('{app}\'), '', false, '', '', ExpandConstant('{app}\'), notPCFonFLY {PCFonFLY}) then break;
if not ISPackZIP ( 0, 0, ExpandConstant('{app}\Game\1\*'), ExpandConstant('{app}\Game\GameData.pak'), 4, true ) then break;
все равно папка на месте (если что архив фриарк запакован в папку = Game\1)
попробуй сам = http://rghost.ru/49509210
 
Последнее редактирование:

vint56

Ветеран
Проверенный
audiofeel но распаковать не смог ошибку выдаёт вот это точно работае у себя проверил
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\Pak0.arc'), ExpandConstant('{app}\game'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\game'), notPCFonFLY{PCFonFLY}) then break;
if not ISPackZIP ( 0, 0, ExpandConstant('{app}\game\Pak0\*'), ExpandConstant('{app}\game\Pak0.pk3'), 2, true ) then break;
 

vint56

Ветеран
Проверенный
audiofeel у меня вообше не хочит распаковывать пишит ошибка ERROR: archive data corrupted (decompression fails) версия фриарка FreeArc 0.67 (December 12 2012)
а через gui ОШИБКА: ошибка в сжатых данных алгоритма lzma:33mb:normal:bt4:128
 

audiofeel

Старожил
вот это точно работае у себя проверил
у меня так
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\Pak0.arc'), ExpandConstant('{app}\game'), '', false, '', '', ExpandConstant('{app}\game'), notPCFonFLY{PCFonFLY}) then break;
if not ISPackZIP ( 0, 0, ExpandConstant('{app}\game\Pak0\*'), ExpandConstant('{app}\game\Pak0.pk3'), 2, true ) then break;

необходимые файлы запакованны в папку Pak0,
затем исдон распаковывает их в папку Game, получается = Game\Pak0, затем
"7зип" запечатывает фаилы по пути = Game\Pak0 в архив = Pak0.pk3 (получается = Game\Pak0.pk3) и по идее должен удалить все файлы в папке Pak0, по пути = Game\Pak0, пакует та он конечно пакует, вот только папка так и не удаляется
 
Последнее редактирование:

vint56

Ветеран
Проверенный
audiofeel утебя стоит в строчке
if not ISPackZIP ( 0, 0, ExpandConstant('{app}\game\Pak0\*'), ExpandConstant('{app}\game\Pak0.pk3'), 2, true ) then break;
если есть возможно то через TeamViewer 8 посмотреть что не так
 
Последнее редактирование:

PUNISHER

Участник
audiofeel, прописал бы уже удаление нужной папки через функцию deltree и не мучался
 

audiofeel

Старожил
PUNISHER, да это то ладно мне уже показали, но вот ведь в чем проблема, "откапал" на флешке репак "Enemy Territory" (принцип тот же) дак и у него теперь тоже папки не удаляются, если ставишь репак на диск на котором винда не стоит, делал в феврале , стояла восьмера, разделов и дисков было столько же, а сейчас стоит 8.1, поэтому и надо понять та, у меня что то может там с правами или с чем то другим. или с исдоном проблемы, я не знаю или это новая фишка от майкрософт
 

tr011tmn

Новичок
добрый день, хотел бы обратится снова к вам за помощью.

Решил реализовать Backup, но немного нестандартным подходом. Всю логику прописал, сам бэкап работает как создание так и восстановление из бэкапа, но столкнулся с проблемой поочередного отображения кнопок в зависимости от заданного условия.

Суть сабжа такова.

1- при запуске инсталлятора первый раз, пользователь видит на WpWelcome кнопку "Сделать Backup" и жмякнув на нее запускает создание бэкапа

2- запустив инсталлятор повторно, происходит проверка:

Если в {app} найден backup.7z то делаем видимым кнопку "Восстановить Backup", если не найден то делает видимым кнопку "Сделать Backup"

Реализовал следующим образом:

Код:
if FileExists(AvRes+'\backup.7z') then
    begin
      MsgBox('Файл найден, install continues', mbInformation, MB_OK);
      #define BackBtnCheck = "False";
    end;
if not FileExists(AvRes+'\backup.7z') then
    begin
      MsgBox('Файл не найден, install stops', mbCriticalError, MB_OK);
      #define BackBtnCheck = "True";
    end;

и 

      #if "True" == BackBtnCheck
      BtnSetVisibility(Backbtn,True);
      #elif "False" == BackBtnCheck
      BtnSetVisibility(UnBackbtn,True);
      #endif
но вот в чем незадача, проверка пути работает, проверочное сообщение выдает верное состояние в зависимости от того есть ли файл в каталоге или нет, а вот define не принимает нужного значения. Уже всю голову сломал, но победить не могу.

P.S. AvRes - это вычисляемая переменная пути которая берется из реестра, которая формирует DefaultDirName через {code:AvPatch}.

Заранее спасибо за вашу помощь.
 

LexBell

Борода
Супер модератор
tr011tmn, команды препроцессора работают только при компиляции скрипта.
как-то так должно выглядеть.
[SOURCE="iss"]var
BackBtnCheck : Boolean;
.........................................

BackBtnCheck := FileExists(AvRes+'\backup.7z');
case BackBtnCheck of
true : MsgBox('Файл найден, install continues', mbInformation, MB_OK);
false : MsgBox('Файл не найден, install stops', mbCriticalError, MB_OK);
end;
BtnSetVisibility(Backbtn,BackBtnCheck);
BtnSetVisibility(UnBackbtn,not BackBtnCheck);[/SOURCE]
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху