Inno Setup (создание инсталяционных пакетов). Часть 2

Статус
В этой теме нельзя размещать новые ответы.

Snoopak96

Старожил
Wile E. Coyote, А у меня не работает!
Всё с тобой ясно, кури справку по делфям (синтаксису и т.д.).
Katarn, Вот еще один способ без всяких таймеров, но тоже нужна расширенная версия от китайцев:
OldProc:= SetWindowLong(WizardForm.ProgressGauge.Handle, -4, CallBackAddr('ProgressBarProc'));
:bayan:
 
Последнее редактирование:

Pirate

Новичок
Katarn, Вот, держи. Подходит как для обычной, так и для расширенной версии Inno Setup. Работает 100%, проверил раз 10.

Katarn, так что, работает?
 
Последнее редактирование:

Katarn

Новичок
Snoopak96, Сорри твой пример тоже рабочий, просто я в одном месте ступил. :wall:, теперь всё айс. :up:.Где можно взять эту справку по делфям (синтаксису и всему прочему)?
 
Последнее редактирование:

Katarn

Новичок
Wile E. Coyote, Да работает. :up2: Благодарю за ссылку. :dance2:
 
Последнее редактирование:

Devils Night

Ветеран
Katarn, есть ещё такой вариант:
[SOURCE="iss"][Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp

[Files]
Source: compiler:Dll Pack\innocallback.dll; DestDir: {tmp}; Flags: dontcopy
Source: C:\WINDOWS\Media\*; DestDir: {app}; Flags: recursesubdirs

Код:
type
TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);

var
PercentsTimer: LongWord;
PercentsLabel: TLabel;

function WrapTimerProc(callback: TTimerProc; Paramcount: Integer): longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): longword; external 'SetTimer@user32';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32 stdcall delayload';

Function NumToStr(Float: Extended): String;
Begin
Result:= Format('%.1n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
SetLength(Result, Length(Result)-1);
End;

Procedure PercentsProc(h, msg, idevent, dwTime: Longword);
Begin
with WizardForm.ProgressGauge do
begin
PercentsLabel.Caption:= 'Выполнено ' + NumToStr((Position*100)/Max) + ' %';
end;
End;

procedure DeinitializeSetup();
begin
KillTimer(0, PercentsTimer);
end;

procedure InitializeWizard();
begin
PercentsLabel:= TLabel.Create(WizardForm);
with PercentsLabel do
begin
Left:= WizardForm.ProgressGauge.Left;
Top:= WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(10);
Width:= WizardForm.StatusLabel.Width;
Height:= WizardForm.StatusLabel.Height;
AutoSize:= False;
Transparent := True;
Parent:= WizardForm.InstallingPage;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
PercentsTimer:= SetTimer(0, 0, 100, WrapTimerProc(@PercentsProc, 4));
end;
end;[/SOURCE][/SPOILER]
 

AlexandR

Новичок
Как в ботве загруженную картинку показать на определенных страницах(первой и последней)?
Пробовал так,показывает также на всех страницах...
Код:
procedure Hide(CurPageID: Integer);
begin
  ImgSetVisibility(img,False);
  Wizardform.WizardBitmapImage.Hide;
end;

procedure Show(CurPageID: Integer);
begin case CurPageID of
  wpWelcome:
begin
  ImgSetVisibility(img,True);
end;
  wpSelectDir:
begin
  ImgSetVisibility(img,False);
end;
  wpInstalling:
begin
  ImgSetVisibility(img,False);
end;
  wpFinished:
begin
  ImgSetVisibility(img,true);
end;
end;
end;
 

Snoopak96

Старожил
AlexandR,
Обновлять окно кажый раз надо при изменениях, юзай ImgApplyChanges(h:HWND), пример:
Код:
procedure Show(CurPageID: Integer);
begin case CurPageID of
  wpWelcome:
begin
  ImgSetVisibility(img,True);
  ImgApplyChanges(WizardForm.Handle);
end;
  wpSelectDir:
begin
  ImgSetVisibility(img,False);
  ImgApplyChanges(WizardForm.Handle);
end;
  wpInstalling:
begin
  ImgSetVisibility(img,False);
  ImgApplyChanges(WizardForm.Handle);
end;
  wpFinished:
begin
  ImgSetVisibility(img,true);
  ImgApplyChanges(WizardForm.Handle);
end;
end;
end;
 

Adil

Старожил
Всем добрый день)
У меня вопрос, разбил игру на 2 ДВД, папку с софтом кинул во второй ДВД, и в конце он выдает ошибку что рядом с setup.exe нету папки с софтом, потом кинул папку с софтом в первый ДВД, и в конце он выдает ошибку что софт не найден. Как с этим быть?
 

Pirate

Новичок
AlexandR,
Snoopak96, намного проще написать ImgApplyChanges в самом конце процедуры. Т.е. так:
Код:
procedure Hide(CurPageID: Integer);
begin
  ImgSetVisibility(img,False);
  Wizardform.WizardBitmapImage.Hide;
  ImgApplyChanges(WizardForm.Handle);
end;

procedure Show(CurPageID: Integer);
begin case CurPageID of
  wpWelcome:
begin
  ImgSetVisibility(img,True);
end;
  wpSelectDir:
begin
  ImgSetVisibility(img,False);
end;
  wpInstalling:
begin
  ImgSetVisibility(img,False);
end;
  wpFinished:
begin
  ImgSetVisibility(img,true);
end;
end;
  ImgApplyChanges(WizardForm.Handle);
end;
 

ShTeCvV

Новичок
Инстал

Прошу помогите!
Как в инстал всунуть сколько осталось и сколько прошло времени?[MOD="Gnom"]Не нужно создавать отдельную тему, при наличии уже существующей.[/MOD]
 
Последнее редактирование модератором:

Katarn

Новичок
Devils Night, Благодарю за код он мне знаком, :) но вот в этом виде он по лучше смотрится:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Files]
Source: compiler:Dll Pack\InnoCallback.dll; Flags: dontcopy
Source:F:\ИГРЫ\Narodnaya solyanka 14.08.2010-03.09.2010 + Bonus\*; DestDir: {app}; Flags: ignoreversion createallsubdirs recursesubdirs

Код:
type
    TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);
var
  TimerID: LongWord;
  PercentsLabel: TLabel;

function WrapTimerProc(callback: TTimerProc; Paramcount: Integer): longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): longword; external 'SetTimer@user32';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32 stdcall delayload';

Function NumToStr(Float: Extended): String;
Begin
    Result:= Format('%.1n', [Float]); StringChange(Result, ',', '.');
    while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
        SetLength(Result, Length(Result)-1);
End;

procedure PercentsInstall();
begin
  with WizardForm.ProgressGauge do
  begin
    PercentsLabel.Caption:= 'Установка игры: ' + NumToStr((Position*100)/Max) + ' %';
  end;
end;

Procedure MyTimerProc(h, msg, idevent, dwTime: Longword);
Begin
    if WizardForm.CurPageID = wpInstalling then PercentsInstall();
End;

procedure DeinitializeSetup();
begin
    KillTimer(0, TimerID);
end;

procedure InitializeWizard();
begin
    PercentsLabel:= TLabel.Create(WizardForm);
  with PercentsLabel do
  begin
    Left:= WizardForm.DirEdit.Left;
    Top:= WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + ScaleY(30);
    Width:= WizardForm.StatusLabel.Width;
    Height:= WizardForm.StatusLabel.Height;
    AutoSize:= False;
    Transparent := True;
    Alignment := taCenter;
    Font.Style:= [fsBold, fsItalic];
    Font.Size:= 14;
    Font.Name:= 'Times New Roman';
    Font.Color:= ClMaroon;
    Parent:= WizardForm.InstallingPage;
   end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssInstall then
  begin
  TimerID:= SetTimer(0, 0, 500 {Установка игры}, WrapTimerProc(@MyTimerProc, 4));
  end;
end;[/SPOILER]
Вот скрин от кода процентов:
[SPOILER="Скрин"][IMG]http://s2.ipicture.ru/uploads/20120506/is535had.jpg[/IMG][/SPOILER]

Ребят нужна помощь помогите кто знает. Использую СИС. Требования от Сталкера на библиотеке [B]"get_hw_caps.dll"[/B], но на некоторую конфигурацию информация не верна! Вопрос как это можно исправить на правильную под цифрой 1 и 2, смотреть скрин:[SPOILER="вот"][IMG]http://s2.ipicture.ru/uploads/20120506/2MXRJWRm.jpg[/IMG][/SPOILER]
Скрипт прилагается: 
[SPOILER="Скрипт"]
[SOURCE="iss"]#define Processor "2000"
#define VideoCard "255500000"
#define RAM "2048"
#define PageFile "756"
#define WinVerMajor          = 5;
#define WinVerMinor          = 1;
#define ServicePack          = 2;

[Setup]
AppName=System Check
AppVerName=System Check
DefaultDirName={pf32}\System Check

[Files]
Source: compiler:Dll Pack\get_hw_caps.dll; Flags: dontcopy

[Code]
function GetVideoCardName: PAnsiChar; external 'hwc_GetVideoCardName@files:get_hw_caps.dll stdcall';
function GetSoundCardName: PAnsiChar; external 'hwc_GetSoundCardName@files:get_hw_caps.dll stdcall';
function GetWindowsName: PAnsiChar; external 'hwc_GetWindowsName@files:get_hw_caps.dll stdcall';
function DetectHardware: Integer; external 'hwc_DetectHardware@files:get_hw_caps.dll stdcall';
function GetHardDriveFreeSpace(hdd: integer): Integer; external 'hwc_GetHardDriveFreeSpace@files:get_hw_caps.dll stdcall';
function GetHardDriveName(hdd: integer): PAnsiChar; external 'hwc_GetHardDriveName@files:get_hw_caps.dll stdcall';
function GetHardDriveTotalSpace(hdd: integer): Integer; external 'hwc_GetHardDriveTotalSpace@files:get_hw_caps.dll stdcall';
function GetHardDrivesCount: Integer; external 'hwc_GetHardDrivesCount@files:get_hw_caps.dll stdcall';
function GetSoundCards: Integer; external 'hwc_GetSoundCards@files:get_hw_caps.dll stdcall';
function GetSystemPage: Integer; external 'hwc_GetSystemPage@files:get_hw_caps.dll stdcall';
function GetSystemPhys: Integer; external 'hwc_GetSystemPhys@files:get_hw_caps.dll stdcall';
function GetVidMemLocal: Integer; external 'hwc_GetVidMemLocal@files:get_hw_caps.dll stdcall';
function GetVidMemNonLocal: Integer; external 'hwc_GetVidMemNonLocal@files:get_hw_caps.dll stdcall';
function GetVideoCardDev: Integer; external 'hwc_GetVideoCardDev@files:get_hw_caps.dll stdcall';
function GetVideoCardVen: Integer; external 'hwc_GetVideoCardVen@files:get_hw_caps.dll stdcall';

function CheckSystemPage(PreviousPageId: Integer): Integer;
  var Page:TWizardPage;
      ProcessorName:string;
      Processor,ProcessorNamePanel,VideoCardNamePanel,VideoCardPanel,AudioCardNamePanel,RAMTotalPanel,PageFileTotalPanel,AudioCardPanel,RAMPanel,PageFilePanel, SystemNamePanel, SystemPanel: TMemo;
      ProcessorMHZ: Cardinal;
      StaticText,StaticText2:TNewStaticText;
      oneGhz,oneMB,Rest:Integer;

  begin
    RegQueryStringValue(HKLM, 'HARDWARE\DESCRIPTION\System\CentralProcessor\0','ProcessorNameString', ProcessorName);
    RegQueryDWordValue(HKLM, 'HARDWARE\DESCRIPTION\System\CentralProcessor\0','~MHz', ProcessorMHZ);
    GetVidMemLocal;
    GetSoundCards;
    GetWindowsName;
    oneGhz:=1000;
    Rest:=ProcessorMHZ - oneGhz;
    oneMB:=1024*1024;

Page:=CreateCustomPage(PreviousPageId,'Апаратное Обоспечение','Программа установки обнаружила следуюшие необходимые компоненты');

  StaticText:=TNewStaticText.Create(Page);
  with StaticText do
  begin
    Parent:=Page.Surface;
    Caption:='Все компоненты удовлетворяют требованиям игры.';
    Left:=0;
    Top:=5;
    AutoSize:=True;
  end;

  StaticText2:=TNewStaticText.Create(Page);
  with StaticText2 do
  begin
    Parent:=Page.Surface;
    Caption:='Когда Вы будуте готовы продолжить установку, нажмите «Далее»'
    Left:=0;
    Top:=220;
    AutoSize:=True;
  end;

//================= Начало - Процессор =================//

  Processor := TMemo.Create(Page);
  with Processor do
  begin
    Parent := Page.Surface;
    Lines.Add(ExpandConstant(' Процессор'));
    Font.Name:= 'Century Schoolbook';
    Font.Size:= 10;
    Color := clAqua;
    Left := ScaleX(0);
    Top := ScaleY(32);
    Width := ScaleX(104);
    Height := ScaleY(21);
    ReadOnly := True; Cursor := crArrow;
  end;

  ProcessorNamePanel := TMemo.Create(Page);
  with ProcessorNamePanel do
  begin
    Parent := Page.Surface;
    Lines.Add(' '+ProcessorName+' @'+IntToStr(ProcessorMHZ)+'MHz');
    Font.Name:= 'Franklin Gothic Medium Cond';
    Font.Size:= 10;
    Left := ScaleX(109);
    Top := ScaleY(32);
    Width := ScaleX(304);
    Height := ScaleY(21);
    Color := clLime;
    ReadOnly := True; Cursor := crArrow;
  end;

//частота процессора//
  if ProcessorMHZ<{#Processor} then
  begin
    ProcessorNamePanel.Color:=clNavy;
    StaticText.Caption:='Компоненты, выделенные красным не удовлетворяют требованиям игры.';
  end;

//================= Конец - Процессор =================//

//================= Начало - Видеоадаптер =================//

  VideoCardPanel:=TMemo.Create(Page);
  with VideoCardPanel do
  begin
    Parent := Page.Surface;
    Lines.Add(ExpandConstant(' Видеоадаптер'));
    Font.Name:= 'Century Schoolbook';
    Font.Size:= 10;
    Color := clAqua;
    Left:=ScaleX(0);
    Top:=Processor.Top+27;
    Width:=ScaleX(104);
    Height:=ScaleY(21);
    ReadOnly := True; Cursor := crArrow;
  end;

  VideoCardNamePanel:=TMemo.Create(Page);
  with VideoCardNamePanel do
  begin
    Parent:=Page.Surface;
    Lines.Add(' '+GetVideoCardName+'  '+IntToStr(GetVidMemLocal/oneMB)+' MB');
    Font.Name:= 'Franklin Gothic Medium Cond';
    Font.Size:= 10;
    Left:=ScaleX(109);
    Top:=VideoCardPanel.Top;
    Width:=ScaleX(304);
    Height:=ScaleY(21);
    Color := clLime;
    ReadOnly := True; Cursor := crArrow;
  end;

//видео память//
  if GetVidMemLocal<{#VideoCard} then
  begin
    StaticText.Caption:='Компоненты, выделенные красным не удовлетворяют требованиям игры.';
    VideoCardNamePanel.Color:=clNavy;
  end

//================= Конец - Видеоадаптер =================//

//================= Начало - Звуковая карта =================//

  AudioCardPanel:=TMemo.Create(Page);
  with AudioCardPanel do
  begin
    Parent := Page.Surface;
    Lines.Add(ExpandConstant(' Звуковая карта'));
    Font.Name:= 'Century Schoolbook';
    Font.Size:= 9;
    Color := clAqua;
    Left := ScaleX(0);
    Top:=VideoCardPanel.Top+27;
    Width := ScaleX(104);
    Height := ScaleY(21);
    ReadOnly := True; Cursor := crArrow;
  end;

  AudioCardNamePanel:=TMemo.Create(Page);
  with AudioCardNamePanel do
  begin
    Parent:=Page.Surface;
    Lines.Add(' '+GetSoundCardName);
    Font.Name:= 'Franklin Gothic Medium Cond';
    Font.Size:= 10;
    Left:=ScaleX(109);
    Top:=AudioCardPanel.Top;
    Width:=ScaleX(304);
    Height:=ScaleY(21);
    Color := clLime;
    ReadOnly := True; Cursor := crArrow;
  end;

//аудио//
  if GetSoundCards=0 then
  begin
    StaticText.Caption:='Компоненты, выделенные красным не удовлетворяют требованиям игры.';
  with
    AudioCardNamePanel do
  begin
    Color:=clred;
    Lines.Add('Не обнаружено');
    ReadOnly := True; Cursor := crArrow;
  end;
  end;

//================= Конец - Звуковая карта =================//

//================= Начало - ОЗУ =================//

  RAMPanel:=TMemo.Create(Page);
  with RAMPanel do
  begin
    Parent := Page.Surface;
    Lines.Add(ExpandConstant(' Память ОЗУ'));
    Font.Name:= 'Century Schoolbook';
    Font.Size:= 10;
    Color := clAqua;
    Left := ScaleX(0);
    Top:=AudioCardPanel.Top+27;
    Width := ScaleX(104);
    Height := ScaleY(21);
    ReadOnly := True; Cursor := crArrow;
  end;

  RAMTotalPanel:=TMemo.Create(Page);
  with RAMTotalPanel do
  begin
    Parent:=Page.Surface;
    Lines.Add(' '+IntToStr(GetSystemPhys + 1) + ' MB');
    Font.Name:= 'Franklin Gothic Medium Cond';
    Font.Size:= 10;
    Left:=AudioCardNamePanel.Left;
    Top:=RAMPanel.Top;
    Width:=AudioCardNamePanel.Width;
    Height:=ScaleY(21);
    Color := clLime;
    ReadOnly := True; Cursor := crArrow;
  end;

//оперативка//
  if GetSystemPhys+1<{#RAM} then
  begin
    RAMTotalPanel.Color:=clred;
    StaticText.Caption:='Компоненты, выделенные красным не удовлетворяют требованиям игры.';
  end;

//================= Конец - ОЗУ =================//

//================= Начало - Файл подкачки =================//

  PageFilePanel:=TMemo.Create(Page);
  with PageFilePanel do
  begin
    Parent := Page.Surface;
    Lines.Add(ExpandConstant(' Файл подкачки'));
    Font.Name:= 'Century Schoolbook';
    Font.Size:= 9;
    Color := clAqua;
    Left := ScaleX(0);
    Top:=RAMPanel.Top+27;
    Width := ScaleX(104);
    Height := ScaleY(21);
    ReadOnly := True; Cursor := crArrow;
  end;

  PageFileTotalPanel:=TMemo.Create(Page);
  with PageFileTotalPanel do
  begin
    Parent:=Page.Surface;
    Lines.Add(' '+IntToStr(GetSystemPage)+' MB');
    Font.Name:= 'Franklin Gothic Medium Cond';
    Font.Size:= 10;
    Left:=RAMTotalPanel.Left;
    Top:=PageFilePanel.Top;
    Width:=RAMTotalPanel.Width;
    Height:=ScaleY(21);
    Color := clLime;
    ReadOnly := True; Cursor := crArrow;
  end;

//файл подкачки//
  if GetSystemPage<{#PageFile} then
  begin
    PageFileTotalPanel.Color:=clred;
    StaticText.Caption:='Компоненты, выделенные красным не удовлетворяют требованиям игры.';
  end;

//================= Конец - Файл подкачки =================//

//================= Начало - Операционная система =================//

  SystemPanel:=TMemo.Create(Page);
  with SystemPanel do
  begin
    Parent := Page.Surface;
    Lines.Add(ExpandConstant(' Система'));
    Font.Name:= 'Century Schoolbook';
    Font.Size:= 10;
    Color := clAqua;
    Left := ScaleX(0);
    Top:=PageFilePanel.Top+27;
    Width := ScaleX(104);
    Height := ScaleY(21);
    ReadOnly := True; Cursor := crArrow;
  end;

  SystemNamePanel:=TMemo.Create(Page);
  with SystemNamePanel do
  begin
    Parent:=Page.Surface;
    Lines.Add('  '+GetWindowsName);
    Font.Name:= 'Franklin Gothic Medium Cond';
    Font.Size:= 10;
    Left:=PageFileTotalPanel.Left;
    Top:=SystemPanel.Top;
    Width:=PageFileTotalPanel.Width;
    Height:=ScaleY(21);
    Color := clLime;
    ReadOnly := True; Cursor := crArrow;
  end;

    Result := Page.ID;
  end;
  
//================= Конец - Операционная система =================//

procedure InitializeWizard();
begin
CheckSystemPage(wpWelcome);
end;[/SOURCE][/SPOILER]
 
Последнее редактирование модератором:

YURSHAT

Тех. админ
Администратор
Katarn, интересно, как мы можем знать, если правильная конфигурация не приведена в примере :)
Вопрос: какая версия библиотеки?

ЗЫ. Запусти скрипт андеркавер. Если получишь те же данные, то ничего не сделать. Разве что определять объем видеопамяти и ось без библиотеки...
 

PUNISHER

Участник
прописываю код который бы при наличии ключа в реестре выбирал бы нужный radiobutton, но почему то не работает. подскажите что не так.
begin
if RegQueryStringValue(HKLM, 'SOFTWARE\XXX','Locale', Ru) then
begin
newradiobutton.Checked:=True
end
end;
 

YURSHAT

Тех. админ
Администратор
PUNISHER, держи правильный пример
 

LexBell

Борода
Супер модератор
ShTeCvV, botva2 пример - progressbar+TimeLeft.iss там помимо прочего оставшееся время. ну а с прошедшим временем даже у новичка не должно проблем возникнуть, вроде :)
 

Katarn

Новичок
YURSHAT, Sorri, вот правильная конфигурация взятая со скрипта андеркавера:
Видеоадаптер: NVIDIA GeForce GT 240 ~1024 MB [1280x1024]
Система: Windows 7 Service Pack 1

Версия библиотеки: "get_hw_caps.dll" - 1.003

Ну с Системой понятно, а как в Видеоадаптаре сделать чтобы было как с скрипте от андеркавера?
 
Последнее редактирование:

YURSHAT

Тех. админ
Администратор
Katarn
1. Зачем ты определяешь процессор через реестр, если библиотека сама может определять его? Функцию смотри в Андеркавере.
2. С видеокартой также, смотри как это сделано в Андеркавере
3. С Осью, тут ничего не поделаешь. Как библиотека определяет Ось - нам неведомо и результат вывода мы изменить не можем. Потому определяй Ось через реестр, пример есть в модуле HWReq...
 

Katarn

Новичок
YURSHAT, Благодарю за полный ответ попробую разобратся, и ещё вопросик будет если я не надоел ещё где взять этот модуль HWReq, скачивать я пока не могу... :unknown:
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху