Jump to content
Korean Random
EvilAlex

Создание инсталляторов для модпаков на базе Inno Setup

Recommended Posts

4 минуты назад, enisgecgen сказал:

Hello,

 

I delete the old files while installing but do not delete them from within the folder
Who can help me ?

 

show the code used

  • Downvote 1

Share this post


Link to post

Short link
Share on other sites
1 час назад, ЛОМ сказал:

 

show the code used

This is ur codes. the codes you gave yesterday

Цитата

#define Patch               "0.9.20.1.2"
#include "SHFileOperation.iss"

[Code]
var
  DeleteRadioButton, MoveRadioButton, NoneRadioButton: TRadioButton;
  DeleteCashAndLogsCheckBox, DeleteUpdatesCheckBox: TCheckBox;

const
  DeleteDescText =
    'Установщик удалит все файлы в папках.';
  MoveDescText =
    'Установщик сделает резервную копию файлов.';
  NoneDescText =
    'Установщик не будет ничего трогать.';

function BackupCheck_1(): Boolean;
var
  DeleteDescLabel, MoveDescLabel, NoneDescLabel: TLabel;
begin
  DeleteRadioButton:=TRadioButton.Create(WizardForm);
  DeleteRadioButton.SetBounds(0, 120, WizardForm.RunList.Width, 20)
  DeleteRadioButton.Checked:=True;
  DeleteRadioButton.Caption:='Удалить моды';
  DeleteRadioButton.Parent:=WizardForm.SelectDirPage;
  DeleteDescLabel:=TLabel.Create(WizardForm);
  DeleteDescLabel.Parent:=WizardForm.SelectDirPage;
  DeleteDescLabel.Left:=0;
  DeleteDescLabel.Top:=DeleteRadioButton.Top + DeleteRadioButton.Height;
  DeleteDescLabel.Width:=WizardForm.SelectDirPage;
  DeleteDescLabel.Height:=20;
  DeleteDescLabel.AutoSize:=False;
  DeleteDescLabel.Wordwrap:=True;
  DeleteDescLabel.Caption:=DeleteDescText;

  MoveRadioButton:=TRadioButton.Create(WizardForm);
  MoveRadioButton.SetBounds(0, 160, WizardForm.RunList.Width, 20)
  MoveRadioButton.Checked:=False;
  MoveRadioButton.Caption:='Сделать резервную копию модов';
  MoveRadioButton.Parent:=WizardForm.SelectDirPage;
  MoveDescLabel:=TLabel.Create(WizardForm);
  MoveDescLabel.Parent:=WizardForm.SelectDirPage;
  MoveDescLabel.Left:=0;
  MoveDescLabel.Top:=MoveRadioButton.Top + MoveRadioButton.Height;
  MoveDescLabel.Width:=WizardForm.SelectDirPage;
  MoveDescLabel.Height:=20;
  MoveDescLabel.AutoSize:=False;
  MoveDescLabel.Wordwrap:=True;
  MoveDescLabel.Caption:=MoveDescText;

  NoneRadioButton:=TRadioButton.Create(WizardForm);
  NoneRadioButton.SetBounds(0, 200, WizardForm.RunList.Width, 20)
  NoneRadioButton.Checked:=False;
  NoneRadioButton.Caption:='Ничего не трогать';
  NoneRadioButton.Parent:=WizardForm.SelectDirPage;
  NoneDescLabel:=TLabel.Create(WizardForm);
  NoneDescLabel.Parent:=WizardForm.SelectDirPage;
  NoneDescLabel.Left:=0;
  NoneDescLabel.Top:=NoneRadioButton.Top + NoneRadioButton.Height;
  NoneDescLabel.Width:=WizardForm.SelectDirPage;
  NoneDescLabel.Height:=20;
  NoneDescLabel.AutoSize:=False;
  NoneDescLabel.Wordwrap:=True;
  NoneDescLabel.Caption:=NoneDescText;

  DeleteCashAndLogsCheckBox:=TCheckBox.Create(WizardForm);
  DeleteCashAndLogsCheckBox.SetBounds(0, 240, WizardForm.RunList.Width, 20)
  DeleteCashAndLogsCheckBox.Checked:=True;
  DeleteCashAndLogsCheckBox.Caption:='Очистить кэш и логи';
  DeleteCashAndLogsCheckBox.Parent:=WizardForm.SelectDirPage;

  DeleteUpdatesCheckBox:=TCheckBox.Create(WizardForm);
  DeleteUpdatesCheckBox.SetBounds(150, 240, WizardForm.RunList.Width, 20)
  DeleteUpdatesCheckBox.Checked:=True;
  DeleteUpdatesCheckBox.Caption:='Очистить папку Updates, освободив место на диске';
  DeleteUpdatesCheckBox.Parent:=WizardForm.SelectDirPage;
end;

function BackupCheck_2(): Boolean;
begin
  If DeleteRadioButton.Checked then
begin
  DelTree(ExpandConstant('{app}\res_mods'), True, True, True);
  CreateDir(ExpandConstant('{app}\res_mods\{#Patch}'));

  DelTree(ExpandConstant('{app}\mods'), True, True, True);
  CreateDir(ExpandConstant('{app}\mods\{#Patch}'));
end;
end;

function BackupCheck_3(): Boolean;
begin
  If MoveRadioButton.Checked then
begin
  MoveDir(ExpandConstant('{app}\res_mods\'),ExpandConstant('{app}\res_mods\backup\res_mods'));
  CreateDir(ExpandConstant('{app}\res_mods\{#Patch}'));

  MoveDir(ExpandConstant('{app}\mods\'),ExpandConstant('{app}\mods\backup\mods'));
  CreateDir(ExpandConstant('{app}\mods\{#Patch}'));
end;
end;

function BackupCheck_4(): Boolean;
begin
  If DeleteCashAndLogsCheckBox.Checked then
begin
  DelTree(ExpandConstant('{userappdata}\wargaming.net\WorldOfTanks\account_caches\'), True, True, True);
  DelTree(ExpandConstant('{userappdata}\wargaming.net\WorldOfTanks\awesomium_cache\'), True, True, True);
  DelTree(ExpandConstant('{userappdata}\wargaming.net\WorldOfTanks\battle_results\'), True, True, True);
  DelTree(ExpandConstant('{userappdata}\wargaming.net\WorldOfTanks\clan_cache\'), True, True, True);
  DelTree(ExpandConstant('{userappdata}\wargaming.net\WorldOfTanks\custom_data\'), True, True, True);
  DelTree(ExpandConstant('{userappdata}\wargaming.net\WorldOfTanks\dossier_cache\'), True, True, True);
  DelTree(ExpandConstant('{userappdata}\wargaming.net\WorldOfTanks\messenger_cache\'), True, True, True);
  DelTree(ExpandConstant('{userappdata}\wargaming.net\WorldOfTanks\tutorial_cache\'), True, True, True);
  DelTree(ExpandConstant('{userappdata}\wargaming.net\WorldOfTanks\xvm'), True, True, True);
end;
end;

function BackupCheck_5(): Boolean;
begin
  If DeleteUpdatesCheckBox.Checked then
begin
  DelTree(ExpandConstant('{app}\Updates'), True, True, True);
  CreateDir(ExpandConstant('{app}\Updates'));
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
BackupCheck_2();
BackupCheck_3();
BackupCheck_4();
BackupCheck_5();
end;
end;

procedure InitializeWizard1();
begin
  BackupCheck_1();
end;




procedure InitializeWizard2();
begin
InitInfo();
end;

procedure InitializeWizard();
begin
 InitializeWizard1();
 InitializeWizard2();
end;

 

Share this post


Link to post

Short link
Share on other sites
8 минут назад, enisgecgen сказал:

This is ur codes. the codes you gave yesterday

 

this is a working code. I have the same running. need to see all the contents of the mod pack

  • Downvote 1

Share this post


Link to post

Short link
Share on other sites
3 часа назад, ЛОМ сказал:

 

this is a working code. I have the same running. need to see all the contents of the mod pack

Руслан лучше по французки у тебя пользователь от туда был и ты этот язык лучше выучил))))))))))))))))))))))))

  • Upvote 1
  • Downvote 1

Share this post


Link to post

Short link
Share on other sites
16 часов назад, ЛОМ сказал:

 

Bu bir çalışma kodu. Aynı koşuya sahibim. mod paketinin tüm içeriğini görmek gerekiyor

 

How can i do upload there? and what u want all source kods?

Share this post


Link to post

Short link
Share on other sites
2 часа назад, enisgecgen сказал:

How can i do upload there? and what u want all source kods?

 

you already have working code.

 

mkw9s6atRwO2JdrzW5E6MA.jpeg

  • Upvote 1
  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

народ. а есть код чтобы при удалении мод-пака ( файлом unins000.dat )  если игра открыта, выводило сообщение мол закройте сначала игру и тд...

  • Upvote 1
  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

@ЛОМ
А что мешает использовать проверку, которая отрабатывает при установке?

 

Вынести проверку отдельно. Использовать при установке и при деинсталляции.

Edited by Kotyarko_O
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
47 минут назад, Kotyarko_O сказал:

@ЛОМ
А что мешает использовать проверку, которая отрабатывает при установке?

 

Вынести проверку отдельно. Использовать при установке и при деинсталляции.

 

я правильно понял если мне нужно только при деинсталляции  то мне нужно тока это в код...

 

#define CheckForGameRun 


#ifdef CheckForGameRun
Function CheckForGameRun(): Boolean;
var
 ResultCode: Integer;
begin
 Result := False;
 if CMDCheckParams(NoCheckForRun) and not IsUninstaller() then
  Exit;
 if (FindWindowByWindowName('World of Tanks (Online Game)') <> 0) or (FindWindowByWindowName('WoT Client') <> 0) then
 begin
  if MsgBoxEx(0, 'Обнаружено запущенное приложение {#MyAppVersion}. Перед продолжением требуется закрыть все экземпляры приложения.' + #13#10 + 'Закрыть игру?',
   'Внимание!', MB_YESNO + MB_DEFBUTTON1 or MB_ICONWARNING, 0, 0) = IDYES then
  begin
   Exec(ExpandConstant('{cmd}'), '/C TASKKILL /F /IM "WorldOfTanks.exe" /IM "WoTLauncher.exe"', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
   case ResultCode of
    0: Result := True;
    128: Result := True;
   end;
  end;
 end else
  Result := True;
end;
#endif


Function InitializeUninstall(): Boolean;
begin
 Result := True;
  #ifdef CheckForGameRun
 Result := CheckForGameRun();
 #endif
end;

 

у меня юникод версия и ошибку выдаёт. сто пудово что то не туда прописываю))) 

 

LYdkK61TTkWFUu-VvXQiIA.jpeg

  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

@ЛОМ 
Строки 173 и 174 можешь просто убрать. И препроцессорные строки зря скопировал, они тебе не нужны.

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
27 минут назад, Kotyarko_O сказал:

@ЛОМ 
Строки 173 и 174 можешь просто убрать. И препроцессорные строки зря скопировал, они тебе не нужны.

 

терь всё как надо. спасибо большое))

  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

народ два вопроса, подскажите пожалуйста. как говорилось в одном фильме - " и да не оскудеет рука дающего и да не отсохнет рука берущего " :biggrin:

1-ый вопрос. к примеру я ставлю моды и выбрал всего несколько модов ( скока не важно ).  затем если я не удалял модпак через unins000.exe то когда я снова открываю установщик то там уже бывают отмечены на установку и те пункты которые я не ставил. по ходу именно те пункты в которых есть радиобутоны.  а если я удалил модпак unins000.exe то тогда всё нормально и нигде галочки не стоят. флаги прописаны вот тока эти - Flags: exclusive  disablenouninstallwarning

 

ZZooMwBGSByNjwR5rgJZGA.jpeg

 

и 2-ой вопрос. на счет автопоиска игры по реестру. я использую вот этот код 

[Setup]
DefaultDirName={code:WotDirNameRU}




[code]
function WotDirNameRU(Path: String): String; // ключ для основного клиента  {1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1
begin
 if RegKeyExists(HKLM, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1') then
 begin
  RegQueryStringValue(HKLM, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1', 'InstallLocation', Path);
  Result := Path
 end else
 if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1') then
 begin
  RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1', 'InstallLocation', Path);
  Result := Path
 end else
 if RegKeyExists(HKCU, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1') then
 begin
  RegQueryStringValue(HKCU, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1', 'InstallLocation', Path);
  Result := Path
 end else
 if RegKeyExists(HKCU, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1') then
 begin
  RegQueryStringValue(HKCU, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1', 'InstallLocation', Path);
  Result := Path
 end else
  Result := ExpandConstant('C:\Games\World_of_Tanks');
end;

 

но дело в том что к примеру  у меня игра на диске "D" и он её находит и всё нормально. затем, я на диске "C"  так же сделал папку с игрой в которую закинул файл  WorldOfTanks.exe. ( ну это я для себя так, моды проверить на свежесть так сказать и тому подобное, короче не это главное )  так вот при открытии мод-пака он мне конечно показывает правильный путь "D".  но если  я поставлю моды на диск "C"  то при следующем открытии мод-пака  он уже будет  всё время выдавать путь  на диск "C" пока я не удалю мод-пак через unins000.exe.   но.. не помню чей это был мод-пак но там, куда бы я  не ставил моды при повторной установке он всё так же указывал правильный путь а не как у меня. как я понял кодов поиска по реестру не один и не два))) мне бы именно такой у кого есть)))  

Edited by ЛОМ
  • Downvote 1

Share this post


Link to post

Short link
Share on other sites
1 hour ago, ЛОМ said:

1-ый вопрос.

По умолчанию, инно всегда пытается дополнять существующие записи предыдущих установок. Из-за этого и отмеченные компоненты могут перемешаться.

Если интересно: http://www.jrsoftware.org/ishelp/topic_appendnotes.htm

Выхода два:

  1. Отключить стандартное сохранение информации о компонентах и делать всё в рантайме: https://bitbucket.org/Kotyarko_O/kmp/src/39a2eb6f8a5e34236f1c4ab404c7ee61f27acc76/Resourses/ParamsRememberer.iss?at=master&fileviewer=file-view-default#ParamsRememberer.iss-28
    (Пример работы с реестром, но можно и стандартными средствами, записывая кастомную инфу в деинсталлятор).
  2. [Setup]
    UninstallLogMod=new

    Но при этом есть вероятность, что файлы, оставшиеся с прошлых установок, после деинсталляции останутся на своих местах (если не предусмотрено принудительное удаление).

 

2 hours ago, ЛОМ said:

2-ой вопрос

Это тоже связано с правилами восстановления информации прошлых установок. Тут DefaultDirName не в приоритете.
Но вообще, это правильно. Так инсталляторы и должны работать.

Не нравится - используй это:

[Setup]
UsePreviousAppDir=no

 

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
4 часа назад, Kotyarko_O сказал:

[Setup] UninstallLogMod=new

 

вот это правильно написано? а то вставляю а он по цвету даже видно что, что то не то. 

 

J3MqgAQCQsGSz_T_q5PgTQ.jpeg

 

а 2-ой вопрос помогло )))

  • Downvote 1

Share this post


Link to post

Short link
Share on other sites
40 minutes ago, ЛОМ said:

вот это правильно написано? а то вставляю а он по цвету даже видно что, что то не то.

Моя опечатка. Должно быть "UninstallLogMode".

Edited by Kotyarko_O
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
4 часа назад, Kotyarko_O сказал:

Моя опечатка. Должно быть "UninstallLogMode".

 

короче не помогает 

[Setup]
UninstallLogModе=new

ладно главное второй вопрос решен. спасибо большое))

  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

народ а в установщике  пункт  типа " восстановление ранее ( ну или последней ) установленной версии "  можно как то сделать*? 

  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...