Скрипты Inno Setup. Помощь и советы [часть 3]

Ответить
 • Просмотры: 37
Аватара пользователя
Baw17

Re: Скрипты Inno Setup. Помощь и советы [часть 3]

Сообщение Baw17 »

R.i.m.s.k.y., честно в коде не разобрался, есть вопросы

куда сохраняет *.reg?

и где прописать какую ветку бэкапить?

данный скрипт работает в XP and Windows 7 X86 and X64?
Аватара пользователя
R.i.m.s.k.y.

Re: Скрипты Inno Setup. Помощь и советы [часть 3]

Сообщение R.i.m.s.k.y. »

Системные требования:


читать дальше »



Код: Выделить всё


type

 PDisplay_Device = record

  cb: DWord;

  DeviceName: array [0..31] of char;

  DeviceString: array [0..127] of char;

  StateFlags: DWord;

  DeviceID, DeviceKey: array [0..127] of char;

 end;



 TMixerCaps = record

  vPid, vDriverVersion: DWord;

  sName: array [0..31] of char;

  Support, cDestinations: DWord;

 end;



// Проверка версии Windows

#if Pos("4.", GetFileVersion(AddBackslash(GetEnv("windir")) + "Explorer.exe")) == 1

    {Win9x}

   TMemoryStatusEx = record

    dwLength, dwMemoryLoad: DWord;

    LoTotalPhys, LoAvailPhys, LoTotalPageFile, LoAvailPageFile,

    LoTotalVirtual, LoAvailVirtual, LoAvailExtendedVirtual, HiTotalPhys,

    HiAvailPhys, HiTotalPageFile, HiAvailPageFile, HiTotalVirtual, HiAvailVirtual,

    HiAvailExtendedVirtual: Integer;

   end;

  function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;

   external 'GlobalMemoryStatus@kernel32.dll stdcall';

#else

    {WinNT}

   TMemoryStatusEx = record

    dwLength, dwMemoryLoad: DWord;

    LoTotalPhys, HiTotalPhys, LoAvailPhys, HiAvailPhys,

    LoTotalPageFile, HiTotalPageFile, LoAvailPageFile, HiAvailPageFile,

    LoTotalVirtual, HiTotalVirtual, LoAvailVirtual, HiAvailVirtual, LoAvailExtendedVirtual,

    HiAvailExtendedVirtual: Integer;

   end;

  function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;

   external 'GlobalMemoryStatusEx@kernel32.dll stdcall';

#endif



const

  DISPLAY_DEVICE_PRIMARY_DEVICE = 4;

  oneMB = 1024*1024;

  NeedMHz = 1800;

  NeedVideoRAM = 128;

  NeedSoundCard = 'Creative X-Fi';

  NeedMB = 512;

  NeedPageFile = 1024;



var

  InfoPage: TWizardPage;

  TopText, BottomText: TNewStaticText;

  ChangeText: Boolean;

  SystemPanel, ProcessorPanel, VideoPanel,

  AudioPanel, RAMPanel, PageFilePanel: TMemo;

  SystemVersionPanel, ProcessorMHzPanel, VideoRAMPanel,

  AudioNamePanel, RAMTotalPanel, PageFileTotalPanel: TMemo;

  lpCaps: TMixerCaps;

  Version: TWindowsVersion;

  MemoryEx: TMemoryStatusEx;

  n, errCode: Integer;

  Keys: TArrayOfString;

  DeviceValue: Cardinal;

  lpDisplayDevice: PDisplay_Device;



function GetSystemMetrics(nIndex: Integer): Integer;

 external 'GetSystemMetrics@user32.dll stdcall';



function GetDeviceCaps(hDC, nIndex: Integer): Integer;

 external 'GetDeviceCaps@GDI32 stdcall';



function CreateDC(lpDriverName, lpDeviceName, lpOutput: String; lpInitData: Integer): Integer;

 external 'CreateDCA@GDI32 stdcall';



function EnumDisplayDevices(lpDevice, iDevNum: DWord; var lpDisplayDevice: PDisplay_Device; dwFlags: DWord): Boolean;

 external 'EnumDisplayDevicesA@user32.dll stdcall';



function mixerGetDevCaps(uDeviceID: LongInt; var lpCaps: TMixerCaps; uSize: LongInt): LongInt;

 external 'mixerGetDevCapsA@winmm.dll stdcall';



function mixerGetNumDevs: Integer;

 external 'mixerGetNumDevs@winmm.dll stdcall';



// Дополнить число до кратного Multiple

function ToMultiple(Bytes, Multiple: Integer): Integer;

begin

  if Abs(Bytes/Multiple) > Bytes/Multiple then

     Result := (Bytes/Multiple + 1)*Multiple

  else

     Result := Bytes

end;



// Перевод числа в значение Бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)

function ByteOrTB(Bytes: Extended; noMB: Boolean): String;

begin

 if not noMB then

    Result := FloatToStr(Int(Bytes)) + ' Мб'

 else

        if Bytes < 1024 then

       Result := FloatToStr(Int(Bytes)) + ' Бт'

    else

             if Bytes/1024 < 1024 then

          Result := FloatToStr(round((Bytes/1024)*10)/10) + ' Кб'

       else

                    if Bytes/oneMB < 1024 then

             Result := FloatToStr(round(Bytes/oneMB*100)/100) + ' Мб'

          else

             if Bytes/oneMB/1000 < 1024 then

                Result := FloatToStr(round(Bytes/oneMB/1024*1000)/1000) + ' Гб'

             else

                              Result := FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) + ' Тб'

 StringChange(Result, ',', '.')

end;



// Удаление начальных, конечных и повторных пробелов

function DelSp(String: String): String;

begin

 while (Pos('  ', String) > 0) do Delete(String, Pos('  ', String), 1)

 Result := Trim(String)

end;



function Size64(Hi, Lo: Integer): Extended;

begin

 Result := Lo

 if Lo < 0 then

    Result := Result + $7FFFFFFF + $7FFFFFFF + 2

 for Hi := Hi-1 downto 0 do Result := Result + $7FFFFFFF + $7FFFFFFF + 2

end;



function CheckCPU(NeedMHz: Integer): Boolean;

var

  String: String;

begin

    String := 'Hardware\Description\System\CentralProcessor'; RegGetSubkeyNames(HKLM, String, Keys)     // Количество ядер

    for n := 0 to GetArrayLength(Keys)-1 do

      RegQueryStringValue(HKLM, String + '\' + Keys[n], 'ProcessorNameString', Keys[n])

    if not RegQueryDWordValue(HKLM, String + '\0', '~MHz', DeviceValue) or (DeviceValue < NeedMHz) then

         Exit

  else

     Result := True

end;



function CheckMemorySize(NeedRAM: Integer): Boolean;

begin

    MemoryEx.dwLength := SizeOf(MemoryEx)

    if not GlobalMemoryStatusEx(MemoryEx) then

         MsgBox('Ошибка функции:' + #13 + 'GlobalMemoryStatusEx', mbError, mb_Ok)

  else

       if (ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) < NeedRAM) then

         Exit

     else

         Result := True

end;



procedure CreateCheckForm();

begin



  TopText := TNewStaticText.Create(InfoPage)

  with TopText do

  begin

    Parent := InfoPage.Surface

    Left := 0

    AutoSize := True

  end



  BottomText := TNewStaticText.Create(InfoPage)

  with BottomText do

  begin

    Parent := InfoPage.Surface

    Caption := 'Когда Вы будете готовы продолжить установку, нажмите «Далее».'

    Font.Color := clBlack

    Left := 0

    Top := 200

    AutoSize := True

  end



  SystemPanel := TMemo.Create(InfoPage)

  with SystemPanel do

  begin

    Text := 'Система'

    Alignment := taCenter

    Parent := InfoPage.Surface

    Left := ScaleX(0)

    Top := ScaleY(33)

    Width := ScaleX(100)

    Height := ScaleY(22)

    ReadOnly := True

    Color := $EEEEEE

  end



  SystemVersionPanel := TMemo.Create(InfoPage)

  with SystemVersionPanel do

  begin

    Alignment := taLeftJustify

    Parent := InfoPage.Surface

    Left := ScaleX(104)

    Top := SystemPanel.Top

    Width := ScaleX(310)

    Height := ScaleY(22)

    ReadOnly := True

   end



  ProcessorPanel := TMemo.Create(InfoPage)

  with ProcessorPanel do

  begin

    Text := 'Процессор'

    Alignment := taCenter

    Parent := InfoPage.Surface

    Left := ScaleX(0)

    Top := SystemPanel.Top + 27

    Width := ScaleX(100)

    Height := ScaleY(22)

    ReadOnly := True

    Color := $EEEEEE

  end



  ProcessorMHzPanel := TMemo.Create(InfoPage)

  with ProcessorMHzPanel do

  begin

    Alignment := taLeftJustify

    Parent := InfoPage.Surface

    Left := ScaleX(104)

    Top := ProcessorPanel.Top

    Width := ScaleX(310)

    Height := ScaleY(22)

    ReadOnly := True

  end



  VideoPanel := TMemo.Create(InfoPage)

  with VideoPanel do

  begin

    Text := 'Видеоадаптер'

    Alignment := taCenter

    Parent := InfoPage.Surface

    Left := ScaleX(0)

    Top := ProcessorPanel.Top + 27

    Width := ScaleX(100)

    Height := ScaleY(22)

    ReadOnly := True

    Color := $EEEEEE

  end



  VideoRAMPanel := TMemo.Create(InfoPage)

  with VideoRAMPanel do

  begin

    Alignment := taLeftJustify

    Parent := InfoPage.Surface

    Left := ScaleX(104)

    Top := VideoPanel.Top

    Width := ScaleX(310)

    Height := ScaleY(22)

    ReadOnly := True

  end



  AudioPanel := TMemo.Create(InfoPage)

  with AudioPanel do

  begin

    Text := 'Звуковая карта'

    Alignment := taCenter

    Parent := InfoPage.Surface

    Left := ScaleX(0)

    Top := VideoPanel.Top + 27

    Width := ScaleX(100)

    Height := ScaleY(22)

    ReadOnly := True

    Color := $EEEEEE

  end



  AudioNamePanel := TMemo.Create(InfoPage)

  with AudioNamePanel do

  begin

    Alignment := taLeftJustify

    Parent := InfoPage.Surface

    Left := ScaleX(104)

    Top := AudioPanel.Top

    Width := ScaleX(310)

    Height := ScaleY(22)

    ReadOnly := True

  end



  RAMPanel := TMemo.Create(InfoPage)

  with RAMPanel do

  begin

    Text := 'Объём памяти'

    Alignment := taCenter

    Parent := InfoPage.Surface

    Left := ScaleX(0)

    Top := AudioPanel.Top + 27

    Width := ScaleX(100)

    Height := ScaleY(22)

    ReadOnly := True

    Color := $EEEEEE

  end



  RAMTotalPanel := TMemo.Create(InfoPage)

  with RAMTotalPanel do

  begin

    Alignment := taLeftJustify

    Parent := InfoPage.Surface

    Left := ScaleX(104)

    Top := RAMPanel.Top

    Width := ScaleX(310)

    Height := ScaleY(22)

    ReadOnly := True

  end



  PageFilePanel := TMemo.Create(InfoPage)

  with PageFilePanel do

  begin

    Text := 'Файл подкачки'

    Alignment := taCenter

    Parent := InfoPage.Surface

    Left := ScaleX(0)

    Top := RAMPanel.Top + 27

    Width := ScaleX(100)

    Height := ScaleY(22)

    ReadOnly := True

    Color := $EEEEEE

  end;



  PageFileTotalPanel := TMemo.Create(InfoPage)

  with PageFileTotalPanel do

  begin

    Alignment := taLeftJustify

    Parent := InfoPage.Surface

    Left := ScaleX(104)

    Top := PageFilePanel.Top

    Width := ScaleX(310)

    Height := ScaleY(22)

    ReadOnly := True

  end



end;



procedure UpdateInfo();

var

  DeviceName, DeviceKey: String;

begin

  ChangeText := False



  GetWindowsVersionEx(Version)



  // Операционная система:

  SystemVersionPanel.Color := $CCFFCC



  DeviceKey := 'Software\Microsoft\Windows NT\CurrentVersion'

  if not UsingWinNT then StringChange(DeviceKey, 'Windows NT', 'Windows')

    RegQueryStringValue(HKLM, DeviceKey, 'ProductName', DeviceName)

  if RegQueryStringValue(HKLM, DeviceKey, 'CSDVersion', DeviceKey) then

     DeviceName := DeviceName + ' ' + DeviceKey

    StringChange(DeviceName, 'Microsoft ', '')

  SystemVersionPanel.Text := ' ' + DeviceName + ' сборка ' + IntToStr(Version.Major) + '.' + IntToStr(Version.Minor) +

                             '.' + IntToStr(Version.Build)



  if (Pos('2000 Service Pack 4', SystemVersionPanel.Text) = 0) and  // Windows 2000 SP4

     (Pos('XP Service Pack 2', SystemVersionPanel.Text) = 0) and  // Windows XP SP2

     (Pos('Vista', SystemVersionPanel.Text) = 0) and  // Windows Vista (c любым SP или без него)

     (Pos('Windows 7', SystemVersionPanel.Text) = 0) then

     begin

      SystemVersionPanel.Color := $CCCCFF

      ChangeText := True

     end



  // Процессор:

  ProcessorMHzPanel.Color := $CCFFCC



  if not CheckCPU(NeedMHz) then

     begin

       ProcessorMHzPanel.Color := $CCCCFF

       ChangeText := True

     end



  ProcessorMHzPanel.Text := ' ' + DelSp(Keys[0]) + ' @' + IntToStr(DeviceValue) + ' MHz'

  if GetArrayLength(Keys) > 1 then

     ProcessorPanel.Text := 'Процессоры' // + ' (' + IntToStr(GetArrayLength(Keys)) + ')'



  // Видеокарта:

  VideoRAMPanel.Color := $CCFFCC



  lpDisplayDevice.cb := SizeOf(lpDisplayDevice)

  DeviceKey := ''

    n := 0

  while not (EnumDisplayDevices(0, n, lpDisplayDevice, 0) and

            (lpDisplayDevice.StateFlags and DISPLAY_DEVICE_PRIMARY_DEVICE > 0)) and (n < 127) do n := n + 1

    for n := 0 to 127 do DeviceKey := DeviceKey + lpDisplayDevice.DeviceKey[n]

  Delete(DeviceKey, Pos(Chr(0), DeviceKey), 127)  // Ключ драйвера получаем из API

    StringChange(DeviceKey, '\Registry\Machine\', '')

  errCode := 1

  DeviceValue := 0

  if RegQueryBinaryValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceName) then

         for n := 1 to Length(DeviceName) do

       begin

         DeviceValue := DeviceValue + Ord(DeviceName[n])*errCode

         errCode := errCode*$100

       end

  else

     if RegQueryDWordValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceValue) then

     else

        RegQueryDWordValue(HKLM, DeviceKey + '\Info', 'VideoMemory', DeviceValue)

    DeviceName := ''

  for n := 0 to 127 do DeviceName := DeviceName + lpDisplayDevice.DeviceString[n]

  Delete(DeviceName, Pos(Chr(0), DeviceName), 127)



  if DeviceName  '' then

    if DeviceValue > 0 then

      VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ', '+ ByteOrTB(DeviceValue/oneMB, False)

    else

      VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ' (Standard), '+ ByteOrTB(DeviceValue/oneMB, False)

  else

     begin

      VideoRAMPanel.Text := ' Драйвер устройства не обнаружен'

      VideoRAMPanel.Color := $CCCCFF

      ChangeText := True

     end

  if (DeviceValue/oneMB < NeedVideoRAM) then

     begin

       VideoRAMPanel.Color := $CCCCFF

       ChangeText := True

     end

  VideoRAMPanel.Text := VideoRAMPanel.Text + ', ' + IntToStr(GetSystemMetrics(0)) + 'x' +

                        IntToStr(GetSystemMetrics(1)) + ' (' + IntToStr(GetDeviceCaps(CreateDC('DISPLAY','','',0),14) *

                        GetDeviceCaps(CreateDC('DISPLAY','','',0),12)) + ' bit)'



  // Звуковая карта:

  AudioNamePanel.Color := $CCFFCC



  // for errCode := 0 to 1 do  // Вывод основного звукового устройства

  for errCode := 0 to mixerGetNumDevs do

    begin

          mixerGetDevCaps(errCode-1, lpCaps, SizeOf(lpCaps))

      DeviceName := ' '

          for n := 0 to 31 do DeviceName := DeviceName + lpCaps.sName[n]

      Delete(DeviceName, Pos(Chr(0), DeviceName), 31)

      Delete(DeviceName, Pos(' [', DeviceName), 31)

      StringChange(DeviceName, 'SB ', 'Creative ')

      Delete(DeviceName, Pos(' Audio', DeviceName), 31)

          SetArrayLength(Keys, errCode)

      if errCode > 0 then Keys[errCode-1] := DeviceName

    end



    if GetArrayLength(Keys) > 1 then

    begin

     AudioPanel.Text := 'Звуковые карты'

     // AudioPanel.Text := 'Звуковые карты (' + IntToStr(GetArrayLength(Keys)) +')'

     AudioNamePanel.Text := ''

     for n := 1 to GetArrayLength(Keys) do

         AudioNamePanel.Text := AudioNamePanel.Text + Keys[n-1]  // + '(' + IntToStr(n) + ')'

    end

   else

    if GetArrayLength(Keys) = 0 then

     begin

      AudioNamePanel.Text := ' Драйвер устройства не обнаружен'

      AudioNamePanel.Color := $CCCCFF

      ChangeText := True

     end

      else

       AudioNamePanel.Text := Keys[0]

  if Pos(NeedSoundCard, AudioNamePanel.Text) = 0 then

     AudioNamePanel.Text := AudioNamePanel.Text + ' (рекомендуется ' + NeedSoundCard + ')'



  // Объём памяти:

    RAMTotalPanel.Color := $CCFFCC

  if not CheckMemorySize(NeedMB) then

    begin

      RAMTotalPanel.Color := $CCCCFF

      ChangeText := True

    end

  RAMTotalPanel.Text := ' ' + ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16), False) + ' всего, ' +

                              ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) -

                                                        Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False) + ' используется, ' +

                              ByteOrTB(Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False) + ' свободно'



  // Виртуальная память:

  PageFileTotalPanel.Color := $CCFFCC

  PageFileTotalPanel.Text := ' ' + ByteOrTB(Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB, False) + ' всего, ' +

                                   ByteOrTB((Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile) -

                                             Size64(MemoryEx.HiAvailPageFile, MemoryEx.LoAvailPageFile))/oneMB, False) + ' занято системным кэшем'

  if Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB < NeedPageFile then

    begin

      PageFileTotalPanel.Color := $CCCCFF

      ChangeText := True

    end



  if ChangeText = True then

    begin

      TopText.Top := 0

      TopText.Caption := 'Не все компоненты удовлетворяют минимальным требованиям игры.' #13

                         'Пожалуйста, проверьте позиции, выделенные красным цветом.'

      TopText.Font.Color := clRed

      // WizardForm.NextButton.Enabled := False

    end

  else

    begin

      TopText.Caption := 'Все компоненты соответствуют минимальным требованиям игры.'

      TopText.Font.Color := clGreen

      TopText.Top := 8

      // WizardForm.NextButton.Enabled := True

    end

end;



procedure InitializeWizard();

begin

  InfoPage := CreateCustomPage(wpLicense, 'Аппаратное и программное обеспечение',

                                          'Программа установки обнаружила следующие наобходимые компоненты.')

  CreateCheckForm()  // Создание объектов TMemo, в которых будет выводится информация о системе

  UpdateInfo()  // Обновление информации о системе

end;



procedure CurPageChanged(CurPageID: Integer);

begin

  if CurPageID = InfoPage.ID then UpdateInfo()  // Обновление информации о системе

end;
Аватара пользователя
Imitri7

Re: Скрипты Inno Setup. Помощь и советы [часть 3]

Сообщение Imitri7 »

покажите плыз пример где ISDone по секции [Tasks] компоненты распаковывает
Аватара пользователя
R.i.m.s.k.y.

Re: Скрипты Inno Setup. Помощь и советы [часть 3]

Сообщение R.i.m.s.k.y. »

Baw17,

сказочник я, недоглядел, в процедуре бэкапа реестра надо CurStep=ssInstall (перед стартом установки, когда зеленая колбаса только поползет), CurStep=ssDone - это в самом конце.

Еще при импорте/экспорте реестра в 64битных ОС надо учитывать и где располагается reg.exe - в {sys} (system32) или {syswow64}



Лександер,

верни в сборке английскую справку инно, она намного полнее! к примеру в русифицированной справке нету переменной syswow64, на русифицированную можно просто ярлык в меню пуск сделать.

Спасибо!
Аватара пользователя
gur74

Re: Скрипты Inno Setup. Помощь и советы [часть 3]

Сообщение gur74 »

Изображение Нужно установить папку в системную Windows, как правильно написать в скрипте чтобы она устанавливалась с файлами скрытыми,системными.
Аватара пользователя
Gnom_aka_Lexander

Re: Скрипты Inno Setup. Помощь и советы [часть 3]

Сообщение Gnom_aka_Lexander »

gur74,



Код:

Код: Выделить всё

[Files]
Source: "MyFile.exe"; DestDir: {win}\MiFolder; Attribs: System Hidden;
Аватара пользователя
gur74

Re: Скрипты Inno Setup. Помощь и советы [часть 3]

Сообщение gur74 »

Лександер



Спасибо огромное!!!



А MiFolder я так понимаю создаваемая папка!?
Аватара пользователя
Gnom_aka_Lexander

Re: Скрипты Inno Setup. Помощь и советы [часть 3]

Сообщение Gnom_aka_Lexander »

Цитата Vitek 07:



SCOOTERTECHNO, поставь это в папку inno setup
Скрипты Inno Setup. Помощь и советы [часть 3]




Поставил, теперь вообще не компилирует Изображение Изображение Изображение Изображение Изображение



Окно ошибки:







Придется переустановить программу. Изображение Хотя файл ISCmplr.dll на месте.
Аватара пользователя
gur74

Re: Скрипты Inno Setup. Помощь и советы [часть 3]

Сообщение gur74 »

Лександер



И еще вопрос на засыпку как обозначать папку Program Files, если Windows {win} то Program Files {pf} что ли и где можно скачать все эти обозначения???
Аватара пользователя
Vitek 07

Re: Скрипты Inno Setup. Помощь и советы [часть 3]

Сообщение Vitek 07 »

gur74, при открытом Inno Setup Compiler жмешь F1и читаешь всё-всё вдумчиво. Переменные описаны в разделе Constants
Ответить

Вернуться в «Автоматическая установка приложений»