asterix93 9 #320574 Posted March 24, 2016 (edited) привет кто знает IDP можэт скачать с mail.ru Edited March 24, 2016 by asterix93 Quote Share this post Link to post Short link Share on other sites
asterix93 9 #320705 Posted March 25, 2016 (edited) Вот харошая штука каму нужна рапорт установке Мои вариант палучение локалныи 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 March 25, 2016 by asterix93 Quote Share this post Link to post Short link Share on other sites
ivan777 1 #320996 Posted March 26, 2016 Здравствуйте ! Нужно реализовать в программе на Delphi проверку на наличие файлов игры, чтобы установка была только в папку с игрой и никуда больше. Или такую же проверку сделать только в установке Inno Sutup при выборе папки для установки . Если кто то знает как это сделать на Inno setup или на Delphi скиньте код пожалуйста Quote Share this post Link to post Short link Share on other sites
Yusha 8 #321005 Posted March 26, 2016 (edited) Здравствуйте ! Нужно реализовать в программе на 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 March 26, 2016 by Yusha 2 2 Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #321104 Posted March 26, 2016 (edited) @ivan777, например. Если нужно на дельфе - также могу привести пример. Edited March 26, 2016 by Kotyarko_O 1 1 Quote Share this post Link to post Short link Share on other sites
asterix93 9 #321188 Posted March 27, 2016 памагите пажалуста ат чево эта ашыбка Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #321191 Posted March 27, 2016 памагите пажалуста ат чево эта ашыбка Если речь идёт о работе с объектами, обращение к элементам которых осуществляется через индексы (например: CheckListBox, ComboBox, StringList и т.д.), то необходимо учитывать, что отсчёт начинается с 0. Например: первый компонент в CheckListBox`е имеет индекс 0, второй компонент - индекс 1, и т.д. Красивее объяснить не смог. Но, думаю, всё понятно. 1 Quote Share this post Link to post Short link Share on other sites
asterix93 9 #321193 Posted March 27, 2016 Если речь идёт о работе с объектами, обращение к элементам которых осуществляется через индексы (например: 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; Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #321194 Posted March 27, 2016 Памагите так правилина или нет С виду правильно. А вообще устанавливай, проверяй и увидишь сам, правильно или нет. Quote Share this post Link to post Short link Share on other sites
asterix93 9 #321195 Posted March 27, 2016 С виду правильно. А вообще устанавливай, проверяй и увидишь сам, правильно или нет. В атам и праблема не работает незнаю пачему гдета у меня ашибка Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #321200 Posted March 27, 2016 (edited) не работает незнаю пачему Никогда не стоит так писать. Если не работает - пиши, что именно (если, конечно, хочешь получить помощь). Edited March 27, 2016 by Kotyarko_O Quote Share this post Link to post Short link Share on other sites
asterix93 9 #321204 Posted March 27, 2016 Никогда не стоит так писать. Если не работает - пиши, что именно (если, конечно, хочешь получить помощь). Не запускаица MCTCreator Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #321218 Posted March 27, 2016 (edited) Не запускаица MCTCreator Потому что одной этой процедуры недостаточно. Помимо этого её описания, её нужно откуда-то выполнить. Выполнение из-под служебных процедур (типа CurStepChanged) было бы не совсем корректно, поэтому я её выполняю непосредственно после распаковки самого MCTCreator`а. Вот так: [Files] Source: "...\MCTCREATOR\*.cfg"; DestDir: "..."; Flags: ignoreversion; Components: ...; Source: "...\MCTCREATOR\MCTCreator.exe"; DestDir: "..."; Flags: ignoreversion; AfterInstall: MCTCreatorLaunch(); Components: ...; Edited March 27, 2016 by Kotyarko_O Quote Share this post Link to post Short link Share on other sites
asterix93 9 #321222 Posted March 27, 2016 Потому что одной этой процедуры недостаточно. Помимо этого её описания, её нужно откуда-то выполнить. Выполнение из-под служебных процедур (типа CurStepChanged) было бы не совсем корректно, поэтому я её выполняю непосредственно после распаковки самого MCTCreator`а. Вот так: [Files] Source: "...\MCTCREATOR\*.cfg"; DestDir: "..."; Flags: ignoreversion; Components: ...; Source: "...\MCTCREATOR\MCTCreator.exe"; DestDir: "..."; Flags: ignoreversion; AfterInstall: MCTCreatorLaunch(); Components: ...; Мда Спасиба палучилась Quote Share this post Link to post Short link Share on other sites
xasic 14 #321558 Posted March 28, 2016 Всем привет. Коллеги. Вдруг кто из вас хорошо знаком с программой Advanced Installer. Нужна минимальная помощь по "сложным" настройкам инсталлятора для получения нужного результата. Откликнитесь, пожалуйста, кто может помочь. Quote Share this post Link to post Short link Share on other sites
asterix93 9 #321676 Posted March 29, 2016 (edited) Привет я брал у 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; Edited March 29, 2016 by asterix93 Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #321677 Posted March 29, 2016 (edited) @asterix93, есть две возможные причины: Или что-то неправильно записано в XML.iss; Или в скрипте, подключаемом раньше по очереди, не закрыты операторные скобки. Edited March 29, 2016 by Kotyarko_O Quote Share this post Link to post Short link Share on other sites
asterix93 9 #321678 Posted March 29, 2016 (edited) @asterix93, есть две возможные причины: Или что-то неправильно записано в XML.iss; Или в скрипте, подключаемом раньше по очереди, не закрыты операторные скобки. Вот скрипт 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 March 29, 2016 by asterix93 Quote Share this post Link to post Short link Share on other sites
Kotyarko_O 1,906 #321681 Posted March 29, 2016 (edited) @asterix93, тогда проверяй последний подключаемый скрипт, перед ConfigEditor.iss. Там и найдёшь ошибку (вангую: end пропущен). Edited March 29, 2016 by Kotyarko_O Quote Share this post Link to post Short link Share on other sites
asterix93 9 #321684 Posted March 29, 2016 (edited) @asterix93, тогда проверяй последний подключаемый скрипт, перед ConfigEditor.iss. Там и найдёшь ошибку (вангую: end пропущен). мда ата праблема была (ух как я тормоз) Edited March 29, 2016 by asterix93 Quote Share this post Link to post Short link Share on other sites