Pavel0145
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Помогите совместить два скрипта: первый: 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; #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 = 2000; NeedVideoRAM = 256; NeedSoundCard = ''; 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'; function ToMultiple(Bytes, Multiple: Integer): Integer; begin if Abs(Bytes/Multiple) > Bytes/Multiple then Result := (Bytes/Multiple + 1)*Multiple else Result := Bytes end; 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) then // Windows Vista (c любым SP или без него) 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 + '' // Объём памяти: 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; procedure CurStepChanged(CurStep: TSetupStep); var S: String; begin If CurStep=ssPostInstall then begin S := ExpandConstant('{commondocs}\STALKER-SHOC\') StringChangeEx(S, ':\', ':\|', True); SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$mod_dir = false | false | $fs_root$ | mods\' + #13, true); SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$app_data_root$=true|false|' + S + #13, true); SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$game_data$ = false| true| $fs_root$| gamedata\' + #13, true); SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$game_ai$ = true| false| $game_data$| ai\' + #13, true); SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$game_spawn$ = true| false| $game_data$| spawns\' + #13, true); SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$game_anims$ = true| true| $game_data$| anims\' + #13, true); SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$game_levels$ = true| false| $game_data$| levels\' + #13, true); SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$game_meshes$ = true| true| $game_data$| meshes\' + #13, true); SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$game_dm$ = true| true| $game_data$| meshes\' + #13, true); SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$game_shaders$ = true| true| $game_data$| shaders\' + #13, true); SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$game_sounds$ = true| true| $game_data$| sounds\' + #13, true); SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$game_textures$ = true| true| $game_data$| textures\' + #13, true); SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$game_scripts$ = true| false| $game_data$| scripts\' + #13, true); SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$game_config$ = true| false| $game_data$| config\' + #13, true); SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$level$ = false| false| $game_levels$' + #13, true); SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$game_saves$ = true| false| $app_data_root$| savedgames\' + #13, true); SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$logs$ = true| false| $app_data_root$| logs\' + #13, true); SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$screenshots$ = true| false| $app_data_root$| screenshots\' + #13, true); end; end; второй: #define MyAppVerName "My Program version" #define MyAppExeName "MyProg.exe" #define path "{app}\MyProg.exe" [Setup] AppName=My Program AppVerName=My Program version DefaultDirName={pf}\My Program OutputDir=. [Files] Source: "MyProg.exe"; DestDir: "{app}"; Source: "FirewallInstallHelper.dll"; DestDir: {app}; [UninstallDelete] Type: files; Name: "{app}\FirewallInstallHelper.dll" Код: function AddApplicationToExceptionListW(path: String; name: String): Boolean; external 'AddApplicationToExceptionListW@files:FirewallInstallHelper.dll stdcall setuponly'; function RemoveApplicationFromExceptionListW(path: String): Boolean; external 'RemoveApplicationFromExceptionListW@{app}\FirewallInstallHelper.dll stdcall uninstallonly'; procedure CurStepChanged(CurStep: TSetupStep); var path, name: String; begin if CurStep = ssPostInstall then begin path:=ExpandConstant('{#path}'); name:=ExpandConstant('{#MyAppVerName}'); AddApplicationToExceptionListW(path, name); end; end; procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); var path: String; begin if CurUninstallStep=usUninstall then begin path:=ExpandConstant('{#path}'); RemoveApplicationFromExceptionListW(path) UnloadDll(ExpandConstant('{app}\FirewallInstallHelper.dll')); end; end; |
|