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

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

Shegorat

Lord of Madness
Администратор
Gnom
Вот пример подобной процедуры
Код:
[noparse][Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp

[code]
var
hBtn: TButton;
Flag: boolean;

procedure HideShow(Sender: TObject);
begin
  If not Flag then begin
    WizardForm.OuterNotebook.Hide;
    hBtn.Caption:='Show';
    Flag:= True;
  end else begin
    WizardForm.OuterNotebook.Show;
    hBtn.Caption:='Hide';
    Flag:= False;
  end;
end;

procedure InitializeWizard();
begin
  hBtn:= TButton.Create(WizardForm);
  hBtn.SetBounds(10, 330, 80, 21);
  hBtn.OnClick:= @HideShow;
  hBtn.Caption:= 'Hide';
  hBtn.Parent:= WizardForm;
  
  Flag:= False;
end;[/noparse]
 

Krinkels

Он где то тут
Администратор
Вот рабочий вариант:
Код:
[B]var Flag: Boolean;[/B]

procedure DirSetup(Sender: TObject);
begin
  for Pag:=0 to getArrayLength(Pages)-1 do
    begin
      Pages[Pag].Hide;
      case Flag of
        FALSE:
          begin
            WizardForm.WizardBitmapImage.Parent := Pages[1];
            Pages[1].Show;
            DirSetupButton.Caption := 'Íàçàä';
            Flag:=TRUE;
            [B]break;[/B]
          end;
        TRUE:
          begin
            WizardForm.WizardBitmapImage.Parent := Pages[0];
            Pages[0].Show;
            DirSetupButton.Caption := 'Íàñòðîèòü';
            Flag:=FALSE;
            [B]break;[/B]
          end;
      end;
    end;
end;
 

DaRKdemoN

Участник
Проверенный
Помогите, пожалуйста, правильно настроить этот код
Просто вынеси
Код:
var Flag: Boolean;
за процедуру. ;)
[hr]Блин, а ведь и точно :) Gnom

[hr]

На будущее пригодится знать ;) - если прописывать переменную в процедуре и использовать её там, то после выполнения этой самой процедуры переменная освобождается.
 
Последнее редактирование модератором:

moonlight

Новичок
Проверенный
Ребят, нужно заблокировать перемещение окна установщика на время установки. Может где-то и есть пример, но я не могу найти его. Буду благодарен за помощь.
 

alexa1995

Участник
moonlight,
Код:
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
 
[_Code]
const
  SC_MOVE = $F010;
  MF_BYCOMMAND = 0;
 
function GetSystemMenu(Wnd: HWnd; bRevert: boolean): HWnd;
external 'GetSystemMenu@user32.dll stdcall';
 
function RemoveMenu(hMenu: HWnd; uPosition: Integer; uFlags: Longint): boolean;
external 'RemoveMenu@user32.dll stdcall';
 
Procedure InitializeWizard();
begin
  RemoveMenu(GetSystemMenu(WizardForm.Handle, false), SC_MOVE, MF_BYCOMMAND);
end;
 

alexa1995

Участник
Код:
[Components]
Name: A; Description: Группа А
Name: A\A1; Description: Компонент 1
Name: A\A2; Description: Компонент 2
Name: B; Description: Группа B
Name: B\B1; Description: Группа B1
Name: B\B1\B11; Description: Компонент 1; Flags: exclusive
Name: B\B1\B22; Description: Компонент 2; Flags: exclusive
 
[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Check: Check1
Source: compiler:Examples\MyProg.chm; DestDir: {app}; Check: Check2
 
[_Code]
function Check1: Boolean;
begin
  Result:=WizardForm.ComponentsList.ItemEnabled[5] and WizardForm.ComponentsList.Checked[5]
end;
 
function Check2: Boolean;
begin
  Result:=WizardForm.ComponentsList.ItemEnabled[6] and WizardForm.ComponentsList.Checked[6]
end;
 
procedure OnClickCheck(Sender: TObject);
begin
  if WizardForm.ComponentsList.Checked[2] = True then
  begin
    WizardForm.ComponentsList.ItemEnabled[4]:=True
    WizardForm.ComponentsList.ItemEnabled[5]:=True
    WizardForm.ComponentsList.ItemEnabled[6]:=True
  end else
  begin
    WizardForm.ComponentsList.ItemEnabled[4]:=False
    WizardForm.ComponentsList.ItemEnabled[5]:=False
    WizardForm.ComponentsList.ItemEnabled[6]:=False
  end
end;
 
procedure InitializeWizard();
begin
  WizardForm.ComponentsList.Checked[2]:=True
  WizardForm.ComponentsList.Checked[4]:=True
  WizardForm.ComponentsList.OnClickCheck:=@OnClickCheck
end;
 

South

Знаток
Проверенный
DaRKdemoN, если нужны битмапы, то можно так
[Setup]
AppName=Test
AppVerName=Test 1.0
DefaultDirName={pf}\Test

[Files]
Source: RESDLL.dll; Flags: dontcopy;

Код:
var
  bmp: TBitmapImage;

function FreeLibrary(hLibModule: LongWord): BOOL; external 'FreeLibrary@kernel32 stdcall';
function LoadLibrary(lpLibFileName: PAnsiChar): LongWord; external 'LoadLibraryA@kernel32 stdcall';
function LoadImage(hInst: THandle; ImageName: PAnsiChar; ImageType: UINT; X, Y: Integer; Flags: UINT): THandle;  external 'LoadImageA@user32 stdcall';

procedure NewButton1Click(Sender: TObject);
var
  h:Cardinal;
begin
  h:=LoadLibrary(ExpandConstant('{tmp}\RESDLL.dll'));
  bmp.Bitmap.Handle:=LoadImage(h,'BMP_1',0,48,48,0);
  FreeLibrary(h);
end;

procedure InitializeWizard;
begin
  ExtractTemporaryFile('RESDLL.dll');

  with WizardForm do begin
    InnerNotebook.Hide;
    OuterNotebook.Hide;
    Bevel.Hide;
  end;

  with TNewButton.Create(WizardForm) do begin
    Name := 'NewButton1';
    Parent := WizardForm;
    Left := ScaleX(48);
    Top := ScaleY(327);
    Width := ScaleX(75);
    Height := ScaleY(25);
    OnClick := @NewButton1Click;
  end;

  bmp:=TBitmapImage.Create(WizardForm);
  with bmp do begin
    SetBounds(100,100,148,148);
    Parent:= WizardForm;       
  end;
end;[/SPOILER]
а если про ощибку, то все просто. третий параметр в FindResource 
RT_BITMAP = MakeIntResource(2) = PAnsiChar(Char(2)) = PAnsiChar(#2)
и это никак не строка, а указатель
к тому же я не уверен, что инно съест хотя бы один из этих вариантов.
 

DaRKdemoN

Участник
Проверенный
если нужны битмапы, то можно так
Спасибо, то же вариант, но как написано в коментах мне надо не только изображения подгружать...

а если про ощибку, то все просто. третий параметр в FindResource
RT_BITMAP = MakeIntResource(2) = PAnsiChar(Char(2)) = PAnsiChar(#2)
и это никак не строка, а указатель
к тому же я не уверен, что инно съест хотя бы один из этих вариантов.
Все три варианта ещё вчера перепробовал (и даже больше). Вот я и спросил как можно передать тип ресурса?

ЗЫ. Млин, уже давно понял что у инно проблемы с указателями, но в этом то случае вроде всё верно? или я не прав? пробовал даже так FindResource(h,'BMP_1',PAnsiChar(IntToStr(2))) и ничего не вышло!
 
Последнее редактирование:

OneTwo

Новичок
Проверенный
Хмм, а можно ли как-то создать ярлык на "Панели быстрого запуска" в Win7?
 

alexa1995

Участник
OneTwo,
Код:
[Tasks]
Name: "additionalicons\quicklaunch\common"; Description: "Для всех"; Flags: exclusive unchecked
[Icons]
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\myprog"; Filename: "{app}\StrongDC.exe"; Tasks: additionalicons\quicklaunch\common
 

OneTwo

Новичок
Проверенный
OneTwo,
Код:
[Tasks]
Name: "additionalicons\quicklaunch\common"; Description: "Для всех"; Flags: exclusive unchecked
[Icons]
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\myprog"; Filename: "{app}\StrongDC.exe"; Tasks: additionalicons\quicklaunch\common
Вобщем-то ошибку выдает - http://s002.youpic.su/pictures/1310846400/ddcebcd041911eaec2aa09d77f8650c7.png Если слешы убрать (additionaliconsquicklaunchcommon) в итоге ничего не создается.
 

alexa1995

Участник
Как скрыть страницу компонентов?
Она не простая компоненты с неё я перенёс в tasks.
Искал но ничего не нашёл.
[hr] прочитав справку. Gnom.
Функция ShouldSkipPage
Код:
function ShouldSkipPage(PageID: Integer): Boolean;
begin
  if(PageID =wpSelectComponents) then Result:= True;
end;
[hr]
Спаисбо!
 
Последнее редактирование модератором:

LexBell

Борода
Супер модератор
Есть еще задачка. Делаю инсталлятор для плагинов к фотошопу, нужно получить несколько путей, единственный найденный вариант - реестр, но там могут быть различия из-за разных версий:
[Registry]
; пути для х64
Root: HKLM; SubKey: SOFTWARE\Adobe\Photoshop; Flags: uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Adobe\Photoshop\12.0; ValueType: string; ValueName: ApplicationPath; ValueData: {pf}\Adobe\Adobe Photoshop CS5.1 (64 Bit)\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Adobe\Photoshop\12.0; ValueType: string; ValueName: PluginPath; ValueData: {pf}\Adobe\Adobe Photoshop CS5.1 (64 Bit)\Plug-Ins\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Adobe\Photoshop\12.0\ApplicationPath; ValueType: string; ValueData: {pf}\Adobe\Adobe Photoshop CS5.1 (64 Bit)\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Adobe\Photoshop\12.0\PluginPath; ValueType: string; ValueData: {pf}\Adobe\Adobe Photoshop CS5.1 (64 Bit)\Plug-Ins\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Adobe\Photoshop\55.0; ValueType: string; ValueName: ApplicationPath; ValueData: {pf}\Adobe\Adobe Photoshop CS5.1 (64 Bit)\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Adobe\Photoshop\55.0; ValueType: string; ValueName: PluginPath; ValueData: {pf}\Adobe\Adobe Photoshop CS5.1 (64 Bit)\Plug-Ins\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Adobe\Photoshop\55.0\ApplicationPath; ValueType: string; ValueData: {pf}\Adobe\Adobe Photoshop CS5.1 (64 Bit)\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Adobe\Photoshop\55.0\PluginPath; ValueType: string; ValueData: {pf}\Adobe\Adobe Photoshop CS5.1 (64 Bit)\Plug-Ins\; Flags: uninsdeletevalue uninsdeletekeyifempty
; пути для х32
Root: HKLM; SubKey: SOFTWARE\Adobe\Photoshop; Flags: uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Adobe\Photoshop\12.0; ValueType: string; ValueName: ApplicationPath; ValueData: {sd}\Program Files (x86)\Adobe\Adobe Photoshop CS5.1\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Adobe\Photoshop\12.0; ValueType: string; ValueName: PluginPath; ValueData: {sd}\Program Files (x86)\Adobe\Adobe Photoshop CS5.1\Plug-Ins\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Adobe\Photoshop\12.0\ApplicationPath; ValueType: string; ValueData: {sd}\Program Files (x86)\Adobe\Adobe Photoshop CS5.1\; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Adobe\Photoshop\12.0\PluginPath; ValueType: string; ValueData: {sd}\Program Files (x86)\Adobe\Adobe Photoshop CS5.1\Plug-Ins\; Flags: uninsdeletevalue uninsdeletekeyifempty
цифра 12 и 55 в путях зависит от версии, нигде в реестре я так и не нашел, как получить версию, чтоб сперва подставить ее, а уж потом подставлять в проверяемый ключ. Вопрос - можно-ли это както решить?
П.С. Нашел ключ, который неизменен, может он поможет в решении задачи.
Код:
; команда открытия файлов типа Photoshop.PlugIn
Root: HKLM; SubKey: SOFTWARE\Classes\Photoshop.PlugIn\shell\open\command; ValueType: string; ValueData: {pf}\Adobe\Adobe Photoshop CS5.1 (64 Bit)\Photoshop.exe; Flags: uninsdeletevalue uninsdeletekeyifempty
 
Последнее редактирование:

Serega

Знаток
Проверенный
Нашел ключ, который неизменен, может он поможет в решении задачи
Ну так можно от туда и выдернуть путь, пример:
Код:
function GetPathPhotoshop: string;
var
  ResultStr: string;
begin
  if RegQueryStringValue(HKLM, 'SOFTWARE\Classes\Photoshop.PlugIn\shell\open\command', '', ResultStr) then
    Result := ExtractFilePath(ResultStr);
end;
в результате получим путь: C:\Program Files\Adobe\Adobe Photoshop CS5.1 (64 Bit)\ , а уже дальше можно подставлять имена искомых папок с проверкой на существование.
 

LexBell

Борода
Супер модератор
Serega, Это да, но главная засада такая - в х64 версиях фотошопа, установка плагинов идет по двум путям, и наличие необходимо по обоим путям - реестр выше взят из одной системы, тоесть эти ключи существуют одновременно, единственное - для х32 изут ключи HKLM32 - с подкаталогом Wow6432Node, я просто удалил его из пути, чтоб народ не смущать, в проверке он все равно не нужен :). По второму реестру можно проверить версию фотошопа, исходя из сводной таблицы версий.
 

DeKaN

Новичок
Gnom, а если получать список веток из HKLM\SOFTWARE\Adobe\Photoshop\ функцией RegGetSubkeyNames?

проблема может возникнуть только, если после удаления старой версии ключи остаются
 

crysis_1830

Новичок
привет мне понравился скрипт Need for Speed™ Undercover.iss v 2.2 [Final]
что знал я его отредактировал а что было не нужно я отключил но у меня возникли проблемы

1 я бы хотел отключить слайд шоу во время установки.

2 например у меня более 3-4 архивов FreeArc нужно чтобы они распаковались по очереди как мне это сделать нашел в скрипте строчку

#define ArcLocation "{src}\*.arc"

хотел сделать так пример

#define ArcLocation "{src}\*мой архив.bin" размер 20мб
#define ArcLocation "{src}\*мой архив-2.bin" размер 320мб

после сборки начел установку, инсталлятор устанавливает только одни архив с размером 320мб
что делать и что прописать и куда и я так понял что эта строчка не для этого


в общем, мне нужно чтоб инсталлятор устанавливал мои архивы если можно помоги пожалуйста я в этом новичок если можите объяснить для особо тупиньких дюдей
 

LexBell

Борода
Супер модератор
crysis_1830, #define ArcLocation "{src}\*.arc" - будут распакованы все архивы с расширением .arc, которые лежат рядом с инсталлятором.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху