PDA

Показать полную графическую версию : [архив] Inno Setup .:[все вопросы]:.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [22] 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

i.Sky
21-01-2009, 05:57
Serega_, спасибо за ответ быстрого реагирования :)
А может просто строки можно как-нибудь внести? Или сделать NAME(1), NAME(2), NAME(3), а потом убрать с них нумерацию? Только я не знаю как...

Serega
21-01-2009, 08:39
строки можно как-нибудь внести »только вручную...
Или сделать NAME(1), NAME(2), NAME(3), а потом убрать с них нумерацию? »а как потом читать данные или записывать в .ini Восприниматься будет только первый NAME.

HQ-Team nuke
21-01-2009, 11:22
Есть portable программа, а именно winamp, все отлично, за исключением одного, все расширения к нему привязываются лишь после запуска и захода в настройки, пробовал это делать средством AutoIt3, но как то это долго очень и не есть правельно, хотелось бы как то это запаковать в Inno Setup с дальнейшей тихой установкой и привязкой расширения к файлам, я скачал мануал по Inno Setup и наткнулся на привязку расширений, возможно ли мною задуманное, кто этим уже занимался, может подскажите что к чему, просто новичек в Inno Setup. Спасибо.

i.Sky
21-01-2009, 11:25
А на Pascal можно реализовать написание такого INI файла? Может ли кто пример написать?

Serega
21-01-2009, 12:18
А на Pascal можно реализовать написание такого INI файла? »Вот накидал пример [Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
DisableProgramGroupPage=yes
DefaultGroupName=My Program
OutputDir=userdocs:Inno Setup Examples Output

[_Code]
procedure BuildINI();
begin
SaveStringToFile(ExpandConstant('{app}')+'\desktop.ini',
'[Section]' + #13 + 'NAME=1' + #13 + 'NAME=2' + #13 + 'NAME=3' + #13, true);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssDone then
BuildINI();
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usUninstall then
begin
DeleteFile(ExpandConstant('{app}\desktop.ini'));
end;
end;

Serega
21-01-2009, 12:43
в Inno Setup с дальнейшей тихой установкой и привязкой расширения к файлам »Скажу честно, winamp ни разу не пересобирал... Я в своё время делал сборку IsoBuster и делал там ассоциации, выкинул лишнее, но принцип я думаю вам будет понятен
;............................................................
[Tasks]
Name: a; Description: (*.ISO) Файлы-образы; GroupDescription: Выбор файловых ассоциаций:; Flags: unchecked
Name: b; Description: (*.BIN) Файлы-образы; GroupDescription: Выбор файловых ассоциаций:; Flags: unchecked
;............................................................

[Registry]
Root: HKCR; Subkey: IsoBuster.iso; ValueType: String; ValueData: ISO Image; Flags: uninsdeletekey; Tasks: a
Root: HKCR; Subkey: IsoBuster.iso\DefaultIcon; ValueType: String; ValueData: {app}\IsoBuster.exe,1; Flags: uninsdeletekey; Tasks: a
Root: HKCR; Subkey: IsoBuster.iso\shell\extract; ValueType: string; ValueData: Извлечь в IsoBuster; Flags: uninsdeletekey; Tasks: a
Root: HKCR; Subkey: IsoBuster.iso\shell\extract\command; ValueType: String; ValueData: """{app}\IsoBuster.exe"" ""/ef:"" ""/c"" ""%1"""; Flags: uninsdeletekey; Tasks: a
Root: HKCR; Subkey: IsoBuster.iso\shell\open; ValueType: string; Flags: uninsdeletekey; Tasks: a
Root: HKCR; Subkey: IsoBuster.iso\shell\open\command; ValueType: String; ValueData: """{app}\IsoBuster.exe"" ""%1"""; Flags: uninsdeletekey; Tasks: a
Root: HKCR; Subkey: .iso; ValueType: String; ValueData: IsoBuster.iso; Flags: uninsdeletevalue; Tasks: a
Root: HKCR; Subkey: IsoBuster.bin; ValueType: String; ValueData: BIN Image; Flags: uninsdeletekey; Tasks: b
Root: HKCR; Subkey: IsoBuster.bin\DefaultIcon; ValueType: String; ValueData: {app}\IsoBuster.exe,1; Flags: uninsdeletekey; Tasks: b
Root: HKCR; Subkey: IsoBuster.bin\shell\extract; ValueType: string; ValueData: Извлечь в IsoBuster; Flags: uninsdeletekey; Tasks: b
Root: HKCR; Subkey: IsoBuster.bin\shell\extract\command; ValueType: String; ValueData: """{app}\IsoBuster.exe"" ""/ef:"" ""/c"" ""%1"""; Flags: uninsdeletekey; Tasks: b
Root: HKCR; Subkey: IsoBuster.bin\shell\open; ValueType: string; Flags: uninsdeletekey; Tasks: b
Root: HKCR; Subkey: IsoBuster.bin\shell\open\command; ValueType: String; ValueData: """{app}\IsoBuster.exe"" ""%1"""; Flags: uninsdeletekey; Tasks: b
Root: HKCR; Subkey: .bin; ValueType: String; ValueData: IsoBuster.bin; Flags: uninsdeletevalue; Tasks: b
; ................................................................

HQ-Team nuke
21-01-2009, 13:40
Скажу честно, winamp ни разу не пересобирал... Я в своё время делал сборку IsoBuster и делал там ассоциации, выкинул лишнее, но принцип я думаю вам будет понятен »
Да мне его как раз и не нужно пересоберать, он имеет один исполняемый файл, при его запуске он создает возле исполняемого файла папку, в которой и хранит все свои настройки, т.е. другим языком как получился этот один файл: Установил Winamp, настроил, упаковал.
Да, мне понятен принцип привязки, немного разберусь в программе, попробую привязать, спасибо.

i.Sky
22-01-2009, 05:22
Вот накидал пример »
Спасибо. Сразу еще вопрос - как прикрутить зависимость от устанавливаемых компонентов к этому коду? Просто в секции [_Сode] ещё ни разу ничего не писал и не знаю что и как.

Serega
22-01-2009, 17:36
как прикрутить зависимость от устанавливаемых компонентов »
В первом примере, как должно быть, т.е. значения будут перезаписываться.
Второй пример как вы хотели, т.е. просто в зависимости от выбора компонента будет добавлятся ещё одна строка.
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[Components]
Name: main; Description: Моя программа™; Types: full custom
Name: help; Description: Помощь; Types: full custom
Name: help\documentation; Description: Документация; Types: full custom
Name: help\manual; Description: Руководство пользователя; Types: full custom

[ Code ]
procedure CurStepChanged(CurStep: TSetupStep);
begin
If CurStep=ssDone then
begin
if IsComponentSelected('main') then
SetIniString('Section', 'NAME', '1', ExpandConstant('{app}')+'\main.ini');

if IsComponentSelected('help') then
SetIniString('Section', 'NAME', '2', ExpandConstant('{app}')+'\main.ini');

if IsComponentSelected('help\documentation') then
SetIniString('Section', 'NAME', '3', ExpandConstant('{app}')+'\main.ini');

if IsComponentSelected('help\manual') then
SetIniString('Section', 'NAME', '4', ExpandConstant('{app}')+'\main.ini');
end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usUninstall then
begin
DeleteFile(ExpandConstant('{app}\main.ini'));
end;
end;

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[Components]
Name: main; Description: Моя программа™; Types: full custom
Name: help; Description: Помощь; Types: full custom
Name: help\documentation; Description: Документация; Types: full custom
Name: help\manual; Description: Руководство пользователя; Types: full custom

[ Code ]
procedure CurStepChanged(CurStep: TSetupStep);
begin
If CurStep=ssDone then
begin
SaveStringToFile(ExpandConstant('{app}')+'\main.ini', '[Section]' + #13, true);

if IsComponentSelected('main') then
SaveStringToFile(ExpandConstant('{app}')+'\main.ini', 'NAME=1' + #13, true);

if IsComponentSelected('help') then
SaveStringToFile(ExpandConstant('{app}')+'\main.ini', 'NAME=2' + #13, true);

if IsComponentSelected('help\documentation') then
SaveStringToFile(ExpandConstant('{app}')+'\main.ini', 'NAME=3' + #13, true);

if IsComponentSelected('help\manual') then
SaveStringToFile(ExpandConstant('{app}')+'\main.ini', 'NAME=4' + #13, true);
end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usUninstall then
begin
DeleteFile(ExpandConstant('{app}\main.ini'));
end;
end;

i.Sky
23-01-2009, 05:55
Спасибо, Serega_. Процесс пошёл.

vserd
30-01-2009, 18:34
Как можно отменить установку если произошла ошибка в CurStepChanged?

т.е.

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then begin
If AlarmFunc then begin
{здесь должен быть некоторый код, который отменит установку.}
(*
WizardForm.close;
abort;
этот код не отменяет устновку :(
*)
end;
end
end;

Serega
30-01-2009, 18:59
Как можно отменить установку если произошла ошибка в CurStepChanged? »Вы пытаетесь отменить установку уже после того как она произошла (ssPostInstall), т.е. надо посмотреть, если уже создан деинсталлятор, а он должен быть уже создан, то вызывать его с командой /verysilent...
А вообще до установки условие AlarmFunc проверить нельзя?

P.S.
WizardForm.close - закрывает инсталлятор, но никак не отменяет установку...

vserd
30-01-2009, 19:12
А вообще до установки условие AlarmFunc проверить нельзя? »
К сожалению низя :((

Serega
30-01-2009, 20:38
vserd, придумал решение [Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program

[ Code]
function NextButtonClick(CurPage: Integer): Boolean;
var
ResultCode: Integer;
begin
Result:=True;
if CurPage=14 then
If (FileSearch('Program.exe', ExpandConstant('{pf}'))='') then
Exec(ExpandConstant('{uninstallexe}'), '/verysilent', ExpandConstant('{app}'), SW_HIDE, ewNoWait, ResultCode);
end;

Вместо проверки на присутствие файла, поставьте проверку вашего условия. Специально выложил целиком, чтоб вы проверили, как работает.
Успехов...

Drongo
02-02-2009, 14:08
Доброго здоровья всем. Скажите, что и как нужно сделать, чтобы при установки была проверка, как на моём скрине:

http://i012.radikal.ru/0902/9f/954e9fe5285f.jpg

Это с игры S.T.A.L.K.E.R сделал, у меня есть методички для этого компилятора, но там у себя не нашёл скриптов как сделать такую проверку. Если параметры железа подходят, вывести зелёным цветом индикацию и кнопку Далее > активизировать, а если что-то из этого не подходит, то красная полоса и деактивировать кнопку Далее >, ну как в игровом инсталяторе сделано.

Serega
02-02-2009, 16:11
Drongo, вот нашёл у себя в примерах скриптов, кнопку ‘Далее’ сделал не активной, если требования не соответствуют.
В скрипте есть описания, разобраться, по крайней мере можно...
[Setup]
AppName=Ultimate Test
AppVerName=Ultimate Test 1.0 Beta 1
DefaultDirName={pf}\Ultimate Test

[_Code]
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) 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 + ' (рекомендуется ' + 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;

Drongo
02-02-2009, 17:44
Честно говоря, я не разбираюсь в этом синтаксисе, но у меня ругается при попытке скомпилировать, на этих строках, которые начинаются символом '#'.

// Проверка версии 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
Раньше необходимости подключать скрипты не было, теперь вот незнаю правильно ли делаю или нет?
...
[Files]
Source: "D:\Контроль\MyNameProgram\MyProgram.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Контроль\MyNameProgram\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; Внимание: Не используйте "Флажок : Игнор. версии" на систем. файл

[Code]
// Вставить код написанный Serega_
...

Serega
02-02-2009, 18:49
у меня ругается при попытке скомпилировать, на этих строках »Потому, что у вас не установлен preprocessor (http://files.jrsoftware.org/ispack/ispack-5.2.3.exe), извиняюсь, что сразу не сказал... :wink:
вот незнаю правильно ли делаю или нет? »Всё правильно... Вообще можно кавычки не ставить, они не обязательны и первая строка в секции [Files] тоже не обязательна, т.к. вы всё равно копируете всю папку, т.е. у вас записано всё правильно, но я бы написал:...
[Files]
Source: D:\Контроль\MyNameProgram\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs

[ Code]
// Вставить код, но он написан не Serega_... :)
...
P.S.
Я бы ещё рекомендовал скачать и установить расширенную версию для Inno Setup от ResTools (http://restools.hanzify.org/inno/InnoCompiler090115_English.zip), очень полезная вещь, расширяет возможности Inno Setup...

Саш_ОК
02-02-2009, 22:44
Ребята а не скажите как зделать так чтоб инсталятор нёс какойто файлик в котором указана версия программи и последнюю дату установки -и что б при установки нового подобного инсталятора (обновления) -видавалось сообщение о версии проги и о версии проги чято устанавливется!!
БУДУ НУ ОЧЕНЬ БЛАГОДАРЕН!

Serega
03-02-2009, 00:29
Саш_ОК, непонятен вопрос... какой файл должен нести инсталлятор? Вы хотите создать файл в момент инсталляции в папке с приложением, а при установке обновления считать из него данные? Какая преследуется цель, запретить установку, если версия не соответствует или просто вывести сообщение о версии установленного файла?




© OSzone.net 2001-2012