Jump to content
Korean Random
EvilAlex

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

Recommended Posts

Share this post


Link to post

Short link
Share on other sites

Наведённый на размышления недавними событиями в теме и желанием решить эту проблему, накидал новую процедурку замены теста:

procedure XVMConfigEdit();
var
  XVMConfig: TStringList;
  XVMConfigDir, Tmp: String;
begin
  XVMConfigDir:=ExpandConstant('{app}\res_mods\xvm\configs\default');
  XVMConfig:=TStringList.Create;
  try
    XVMConfig.LoadFromFile(XVMConfigDir + '\rating.xc');
    Tmp:=XVMConfig.Text;
    StringChange(Tmp, '"showPlayersStatistics": false,', '"showPlayersStatistics": true,');
    StringChange(Tmp, '"enableUserInfoStatistics": true,', '"enableUserInfoStatistics": false,');
    StringChange(Tmp, '"enableCompanyStatistics": true,', '"enableCompanyStatistics": false,');
    XVMConfig.Text:=Tmp;
    XVMConfig.SaveToFile(XVMConfigDir + '\rating.xc');
  finally
    XVMConfig.Free;
  end;
end;

Спасибо StranikS_Scan за наводку и размышление по теме, сам то думал решать эту проблему по-другому. Но его вариант развития этой тоже очень хорош.

 

Применение уже сами найдёте! :gawi:

  • Upvote 2

Share this post


Link to post

Short link
Share on other sites

 

 

Наведённый на размышления недавними событиями в теме и желанием решить эту проблему
По той же причине начал искать какой-то способ редактирования json, через Inno помимо той библиотеки, которая работает только на Unicode. Нашёл данный пример)
[Files]
Source: "conf.xc"; DestDir: "{app}"; AfterInstall: Parametrage

[Code]
procedure Parametrage;
var
  App, Tmp: String;
begin
  App := ExpandConstant('{app}');
  if not LoadStringFromfile(App + '\Conf.xc', Tmp) then
    MsgBox('Возникла ошибка при открытии.', mbInformation, MB_OK)
  else
  begin
    StringChange(Tmp, '"mirroredVehicleIcons": true,', '"mirroredVehicleIcons": false,');
    if not SaveStringToFile(App + '\Conf.xc', Tmp, False) then
      MsgBox('Возникла ошибка при сохранении!', mbInformation, MB_OK);
  end;
end;

Share this post


Link to post

Short link
Share on other sites

Kotyarko_O, тоже не плохо. Но лучше через TStringList, так можно сразу несколько значений менять.

Share this post


Link to post

Short link
Share on other sites

Вы чего творите, товарищи? Ваши LoadFromFile и SaveToFile   с UTF-8 же не контачат?????

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

Вы чего творите, товарищи? Ваши LoadFromFile и SaveToFile   с UTF-8 же не контачат?????

 Контачат :gawi:

Share this post


Link to post

Short link
Share on other sites

 Контачат :gawi:

 

Сомневаюсь. Он скорее всего xc прочитает как ANSI и в начале текста будет UTF-8 преамбула а кириллица будет прочитана кракозябрами?

Share this post


Link to post

Short link
Share on other sites

Сомневаюсь. Он скорее всего xc прочитает как ANSI и в начале текста будет UTF-8 преамбула а кириллица будет прочитана кракозябрами?

 Проверил на minimap.xc, hotkeys.xc, rating.xc, battle.xc - без проблем после замены. В игре работает всё нормально, реплей на наличие ошибок не ругается.

Share this post


Link to post

Short link
Share on other sites

:no:

Умеет.

Без сторонних библиотек можно редактировать те же конфиги XVM... они хоть и имеют расширение XC, а внутри все тот же json.

Но я тебя сразу отговорю... лучше работай с заменой файлов ибо у пользователей полно проблем с ОС... и часто необходимо сперва все dll системы восстанавливать...

Лично я только в конфиге миникарты делаю подмену false на true... и то, чтобы не жалко было функцию зря писать.

Спасибо огромное: подтвердили мои догадки (слаб я в Паскале), я тем же путем пришел к подмене false/true... Вот только не устраивает меня это решение (кривое и излишне сложное получается). Пытаюсь в Делфи найти решение... Вот вас бы (сильных в Делфи) объединить в единый проект... Полироид так и задвинул проект по настройке своего мода... А у меня один детский лепет получается пока...

 

ЗЫ: Я вижу в этой теме народ стал потихоньку вылазить за рамки Inno Setup и плавно вливаться в Delphi и ObjPascal, вопросики стали появляться, dll-ки.... как там писал К.Маркс - наблюдается переход количественных изменений в качественные. :)))))))))

Качество на самом деле давно зашкалило за количество... Может откроете темку на ту же тему (приношу извинения за тавтологию) по Делфи? :-)

Share this post


Link to post

Short link
Share on other sites
Может откроете темку на ту же тему (приношу извинения за тавтологию) по Делфи?

А зачем?

Edited by Kotyarko_O

Share this post


Link to post

Short link
Share on other sites

StranikS_Scan, если менять латинские буквы, цифры и знаки пунктуации, то проблем нет.

Share this post


Link to post

Short link
Share on other sites

StranikS_Scan, если менять латинские буквы, цифры и знаки пунктуации, то проблем нет.

 

  :heh:  Я же давно в курсе что чудес не бывает. Давайте угадаю как он работает (Инно). Он понятия не имеет что там UTF-8. Он открывает файл, считывает как ANSI вместо с преамбулой и всем что там есть. В UTF-8 как и в ANSI сначала идёт латинца, пунктуация и цифры, они одинаково отображаются в любой кодировке. Если вы меняете только их, то дальше весь этот текст записывается обратно в файл и по сути ни каких проблем у нас не наблюдается.

 

Но вот если нуно изменить блок текста с кириллицей вот тут-то косячки и будут:

 

Косяк №1: Ищем блок текста с кириллицей записанной в ANSI, а текст в буфере закодирован в UTF-8 значит поиск не найдет совпадений, хотя текст-то один и тот же, но вот кодировочка то разная

 

Косяк №2: Вставляем в буфер текст на кириллице, опять косяк, в буфере она в UTF-8 а мы вставляем как ANSI после записи буфера в файл и его прочтения XVM-ом, который распознает UTF-8 записанная нами киррилица будет по ошибке перекодирована в кракозябрики, ведь он будет думать что весь файл в UTF-8.

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

StranikS_Scan, всё верно. Косяки начинаются с кириллицы и etc.

Share this post


Link to post

Short link
Share on other sites

Отвлекитесь пожалуйста ребятки на мой детский вопросец: при добавлении фичи, которая работает через процедуру AboutSetupClick, должно в инсталляторе инфу о программе менять на заданную мной строку текста, всё успешно меняется, но при досрочном закрытии модпака или полном завершении установки инсталлятор вылетает с окном "преждевременное закрытие .... винда ищет решение этой проблемы".

вот то, что я добавляю, секция код:

type

TWFProc = function(h:hWnd;Msg,wParam,lParam:Longint):Longint;

 

function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam: Longint; lParam: Longint): Longint; external '[email protected] stdcall';

function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external '[email protected] stdcall';

function WrapWFProc(Callback: TWFProc; ParamCount: Integer): Longword; external 'wrapcallbackaddr@files:CallbackCtrl.dll stdcall';

 

var

OldProc:Longint;

 

procedure AboutSetupClick;

begin

//çäåñü îáðàáàòûâàåì íàæàòèå íà ïóíêò ìåíþ "Î ïðîãðàììå ..."

MsgBox('Ìîäïàê îò Darksoul. Ìîè êîíòàêòû: Skype: kozyrny2', mbInformation, MB_OK);

end;

 

function WFWndProc(h:HWND;Msg,wParam,lParam:Longint):Longint;

begin

if (Msg=$112) and (wParam=9999) then begin

Result:=0;

AboutSetupClick;

end else begin

if Msg=$2 then SetWindowLong(WizardForm.Handle,-4,OldProc);

Result:=CallWindowProc(OldProc,h,Msg,wParam,lParam);

end;

end;

 

procedure InitializeWizard3;

begin

OldProc:=SetWindowLong(WizardForm.Handle,-4,WrapWFProc(@WFWndProc,4));

end;

.

Или я что-то упустил, или там нельзя кириллицей писать само сообщение.

Share this post


Link to post

Short link
Share on other sites

или там нельзя кириллицей писать само сообщение.

Можно.

 

'Попробуй так:'

[code]
 #ifdef UNICODE
    #define A "W"
 #else
    #define A "A"
 #endif

var
OldProc:Longint;

type
TWFProc = function(h:hWnd;Msg,wParam,lParam:Longint):Longint;

function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam: Longint; lParam: Longint): Longint; external '[email protected] stdcall';
function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function WrapWFProc(Callback: TWFProc; ParamCount: Integer): Longword; external 'wrapcallbackaddr@files:CallbackCtrl.dll stdcall';

procedure AboutSetupClick;
begin
MsgBox('Ìîäïàê îò Darksoul. Ìîè êîíòàêòû: Skype: kozyrny2', mbInformation, MB_OK);
end;

function WFWndProc(h:HWND;Msg,wParam,lParam:Longint):Longint;
begin
if (Msg=$112) and (wParam=9999) then begin
Result:=0;
AboutSetupClick;
end else begin
if Msg=$2 then SetWindowLong(WizardForm.Handle,-4,OldProc);
Result:=CallWindowProc(OldProc,h,Msg,wParam,lParam);
end;
end;

procedure InitializeWizard3;
begin
OldProc:=SetWindowLong(WizardForm.Handle,-4,WrapWFProc(@WFWndProc,4));
end;

Если не получится, попробуй ещё заменить это:

function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam: Longint; lParam: Longint): Longint; external '[email protected] stdcall';

на это:

function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam: Longint; lParam: Longint): Longint; external 'CallWindowProc{#A}@user32.dll stdcall';
Edited by Kotyarko_O

Share this post


Link to post

Short link
Share on other sites

первый вариант не помог, тестирую второй (компилируется пока что:) ).


второй тоже не помог, просто пока убрал эту функцию.

Share this post


Link to post

Short link
Share on other sites

 

 

просто пока убрал эту функцию
И без неё всё норм?
У меня тот же код для изменения текста в "О программе" и никаких ошибок винда не находит.

Share this post


Link to post

Short link
Share on other sites

без неё всё норм


скайп есть? я покажу


может я что-то не дописал, или не туда тыкаю код??

Share this post


Link to post

Short link
Share on other sites

@Darksoul, а процедуру InitializeWizard3 в основную InitializeWizard подключил?

Edited by Kotyarko_O

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...