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

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

urban

Старожил
хм,а как сделать чтобы файлы не попадали в папку темп? я destdir удалил,но файлы в темп все-равно кидаются
 

sergey3695

Ветеран
Модератор
хм,а как сделать чтобы файлы не попадали в папку темп? я destdir удалил,но файлы в темп все-равно кидаются
в скрипте удалил? и как скомпилилось? мне прям интересно :o
---
Как удалить после себя создаваемые inno папки в {tmp}?
Или если создать свою папку в {tmp} то как запретить её удаление пока запущен установщик?
 
Последнее редактирование:

urban

Старожил
sergey3695, ну не знаю,замечал в некоторых репаках есть такой прикол,что в папке темп нету файлов с инсталла,вот и мне интересно стало как это сделать?может там просто они попадают в другую папку..
 

sergey3695

Ветеран
Модератор
urban, кидают файлы в другую папку (куда нибудь) и потом оттуда все берется.
Скажем {tmp}\папка
Я вот только незнаю как защитить от удаления папку или она будет в процессе и не удалится?
---
Если никто не ответит то сам попробую. Я никуда не спешу. :)
 

urban

Старожил
sergey3695, а если указать {app}/temp,то потом после установки с папки с игрой они удалятся?
 

sergey3695

Ветеран
Модератор
urban, даже незнаю. непробывал как-то менять. попробуй. если что, то потом файлы самому несложно будет удалить.
 

Shegorat

Lord of Madness
Администратор
хм,а как сделать чтобы файлы не попадали в папку темп? я destdir удалил,но файлы в темп все-равно кидаются
Извлекать в другую папку, в память, просто напросто скрывать...

Как удалить после себя создаваемые inno папки в {tmp}?
Или если создать свою папку в {tmp} то как запретить её удаление пока запущен установщик?
Все зависит от поставленной задачи. Если там будут лежать файлы, использующиеся во время установки, то папку и не удалить - система сама не даст удалить. В остальных случая можно что-нибудь придумать.

sergey3695, а если указать {app}/temp,то потом после установки с папки с игрой они удалятся?
Только если у них будет установлен флаг deleteafterinstall
 

urban

Старожил
кароче,пусть уже будет как есть,так как в коде есть строки ExtractTemporaryFile что само по себе файл в папку темп перемещает
 

Shegorat

Lord of Madness
Администратор
А как их скрыть?
Код:
Source: "myfile.bmp"; DestDir: "{tmp}"; [b]Attribs: hidden system[/b]
Если файлы извлекаются во время установки.
Если вызывается ExtractTemporaryFile, то для каждого извлеченного файла нужно вызывать SetFileAttributes
Код:
function SetFileAttributes(lpFileName: PAnsiChar; dwFileAttributes: Longword): Boolean; external 'SetFileAttributesA@kernel32.dll stdcall';
***
SetFileAttributes(PAnsiChar(ExpandConstant('{tmp}\myfile.bmp')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM or FILE_ATTRIBUTE_NORMAL);
 

urban

Старожил
Shegorat, все сделал но жаль что для слайдшоу такое не сделаешь,будет писать что файл слайда не найден,но ничего страшного
А на iswin7logo нельзя же сделал лого кликабельным?
 
Последнее редактирование:

andrey_167

Новичок
Здраствуйте подскажите как обьеденить страницу с выбором куда установить и папку в меню пуск
 

vint56

Ветеран
Проверенный
andrey_167
[Setup]
AppName=Dir+Group
AppVersion=Dir+Group
DefaultDirName={pf}\Dir+Group
DisableProgramGroupPage=yes

Код:
procedure InitializeWizard();
begin
    with WizardForm.DirBrowseButton do
  begin
    Top := ScaleY(73);
  end;

  with WizardForm.DirEdit do
  begin
    Top := ScaleY(73);
  end;

  with WizardForm.SelectDirBrowseLabel do
  begin
    Top := ScaleY(36);
  end;

  with WizardForm.SelectGroupBitmapImage do
  begin
    Top := ScaleY(105);
    Parent := WizardForm.SelectDirPage;
  end;

  with WizardForm.GroupBrowseButton do
  begin
    Top := ScaleY(176);
    Parent := WizardForm.SelectDirPage;
  end;

  with WizardForm.GroupEdit do
  begin
    Top := ScaleY(177);
    Parent := WizardForm.SelectDirPage;
  end;

  with WizardForm.SelectStartMenuFolderBrowseLabel do
  begin
    Parent := WizardForm.SelectDirPage;
    Top := ScaleY(140);
  end;

  with WizardForm.SelectStartMenuFolderLabel do
  begin
    Parent := WizardForm.SelectDirPage;
    Top := ScaleY(113);
  end;
end;[/SPOILER]

[SPOILER="сделал короче"][Code]
procedure InitializeWizard();
begin
  WizardForm.DirBrowseButton.Top := ScaleY(73);
  WizardForm.DirEdit.Top := ScaleY(73);
  WizardForm.SelectDirBrowseLabel.Top := ScaleY(36);
  WizardForm.SelectGroupBitmapImage.Top := ScaleY(105);
  WizardForm.SelectGroupBitmapImage.Parent := WizardForm.SelectDirPage;
  WizardForm.GroupBrowseButton.Top := ScaleY(176);
  WizardForm.GroupBrowseButton.Parent := WizardForm.SelectDirPage;
  WizardForm.GroupEdit.Top := ScaleY(177);
  WizardForm.GroupEdit.Parent := WizardForm.SelectDirPage;
  WizardForm.SelectStartMenuFolderBrowseLabel.Top := ScaleY(140);
  WizardForm.SelectStartMenuFolderBrowseLabel.Parent := WizardForm.SelectDirPage;
  WizardForm.SelectStartMenuFolderLabel.Top := ScaleY(113);
  WizardForm.SelectStartMenuFolderLabel.Parent := WizardForm.SelectDirPage;
end;[/SPOILER]
 
Последнее редактирование:

nik1967

Old Men
Проверенный
Всем доброго времени суток! Возникла необходимость средствами Inno узнать название видеоадаптера. Кто подскажет, как с помощью API в Inno это провернуть?
 

vint56

Ветеран
Проверенный
nik1967 пример от Victor_Dobrova посмотри
[Setup]
AppName=GetDeviceInfo
AppVerName=GetDeviceInfo
CreateAppDir=false

Код:
 type
     TWaveOutCaps = record vPid, vDriverVersion: DWord; sName: array[0..31] of Char; Formats: DWord; Channels: Word; Support: DWord; end; 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;
 Const
     oneMB= 1024*1024; DISPLAY_DEVICE_PRIMARY_DEVICE = 4;
 var
     Report: String; n, errCode: Integer; lpCaps: TWaveOutCaps; lpDisplayDevice: PDisplay_Device; DeviceValue: Cardinal; VideoName, SoundName, MixerName, DeviceKey: String; Keys: TArrayOfString;

 function EnumDisplayDevices(lpDevice, iDevNum: DWord; var lpDisplayDevice: PDisplay_Device; dwFlags: DWord):Boolean; external 'EnumDisplayDevicesA@user32.dll stdcall';
 function waveOutGetDevCaps(uDeviceID: LongInt; var lpCaps: TWaveOutCaps; uSize: LongInt): LongInt; external 'waveOutGetDevCapsA@winmm.dll stdcall';
 function waveOutGetNumDevs: Integer; external 'waveOutGetNumDevs@winmm.dll stdcall';
 function mixerGetDevCaps(uDeviceID: LongInt; var lpCaps: TWaveOutCaps; uSize: LongInt): LongInt; external 'mixerGetDevCapsA@winmm.dll stdcall';
 function mixerGetNumDevs: Integer; external 'mixerGetNumDevs@winmm.dll stdcall';

 Function InitializeSetup: Boolean;
 Begin
 {video}
     lpDisplayDevice.cb:= SizeOf(lpDisplayDevice);
     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;        { объём видеопамяти }
         RegQueryBinaryValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', VideoName)    { проверку 9х или NT не делаю }
         for n:= 1 to Length(VideoName) do
         begin
             DeviceValue:= DeviceValue + Ord(VideoName[n]) *errCode; errCode:= errCode * $100; end;
             VideoName:= ''; for n:= 0 to 127 do VideoName:= VideoName + lpDisplayDevice.DeviceString[n]; Delete(VideoName, Pos(Chr(0), VideoName), 127);
             if VideoName <> '' then
                 if DeviceValue > 0 then VideoName:= VideoName +', '+ IntToStr(DeviceValue/oneMB) + 'Mb' else VideoName:= VideoName +' (стандартный драйвер)'
             else VideoName:= 'Ошибка драйвера или оборудования'
 {sound}
     for errCode:= 0 to waveOutGetNumDevs do begin
         waveOutGetDevCaps(errCode-1, lpCaps, SizeOf(lpCaps)); SoundName:=''
         for n:= 0 to 31 do SoundName:= SoundName + lpCaps.sName[n]; Delete(SoundName, Pos(Chr(0), SoundName), 31);
         SetArrayLength(Keys, errCode+1);  if errCode+1 > 0 then Keys[errCode]:= SoundName
     end;
 SoundName:= #9
     if errCode > 0 then
         for n:= 0 to GetArrayLength(Keys) -1 do
         SoundName:= SoundName + Keys[n] + #13#10#9
     else SoundName:= #9 'Звуковые устройства не обнаружены'

 {mixer}
     for errCode:= 0 to mixerGetNumDevs do begin
         mixerGetDevCaps(errCode-1, lpCaps, SizeOf(lpCaps)); MixerName:=''
         for n:= 0 to 31 do MixerName:= MixerName + lpCaps.sName[n]; Delete(MixerName, Pos(Chr(0), MixerName), 31);
         SetArrayLength(Keys, errCode);  if errCode > 0 then Keys[errCode-1]:= MixerName
     end;
 MixerName:= #9
     if errCode > 0 then
         for n:= 0 to GetArrayLength(Keys) -1 do
         MixerName:= MixerName + Keys[n] + #13#10#9
     else MixerName:= #9 'Звуковые устройства не обнаружены'

     Report:= 'Video: '#9 + VideoName + #13#10 'Key: '#9 + DeviceKey + #13#10#13 'SoundCards: '#13#10 + SoundName + #13#10 'MixerDev: '#13#10 + MixerName
 MsgBox(Report, mbInformation, mb_Ok)
     SaveStringToFile('Report.txt', Report, True);
 End;[/SPOILER]
 
Последнее редактирование:

David.D.Rocco

Участник
Проверенный
nik1967,
Код:
[_code]
const 
  GL_RENDERER = $1F01;
  GL_VENDOR = $1F00;

  PFD_DRAW_TO_WINDOW = 4;
  PFD_SUPPORT_OPENGL = 32;
  PFD_DOUBLEBUFFER = 1;
  PFD_TYPE_RGBA	= 0;
  PFD_MAIN_PLANE	= 0;

type
  TPixelFormatDescriptor = record
    nSize, nVersion: Word;
    dwFlags: DWORD;
    iPixelType, cColorBits, cRedBits, cRedShift, cGreenBits, cGreenShift, 
    cBlueBits, cBlueShift, cAlphaBits, cAlphaShift, cAccumBits, cAccumRedBits,
    cAccumGreenBits, cAccumBlueBits, cAccumAlphaBits, cDepthBits, cStencilBits,  cAuxBuffers: Byte;
    iLayerType, bReserved: Byte;
    dwLayerMask, dwVisibleMask, dwDamageMask: DWORD;
  end;

procedure RtlZeroMemory(destination: TPixelFormatDescriptor; length: dword); external 'RtlZeroMemory@kernel32';

function glGetString(index: Integer): PAnsichar; external 'glGetString@opengl32.dll stdcall';

function wglCreateContext(DC: Cardinal): Cardinal; external 'wglCreateContext@opengl32';
function wglDeleteContext(p1: Cardinal): BOOL; external 'wglCreateContext@opengl32';
function wglMakeCurrent(DC: Cardinal; p2: Cardinal): BOOL; external 'wglMakeCurrent@opengl32';

function GetDC(hWnd: HWND): Cardinal; external 'GetDC@user32';
function ReleaseDC(hWnd: HWND; hDC: Cardinal): Integer; external 'ReleaseDC@user32';

function ChoosePixelFormat(DC: Cardinal; p2: TPixelFormatDescriptor): Integer; external 'ChoosePixelFormat@gdi32';
function SetPixelFormat(DC: Cardinal; PixelFormat: Integer; FormatDef: TPixelFormatDescriptor): BOOL; external 'SetPixelFormat@gdi32';

procedure EnableOpenGL(h: HWND; var Dc: Cardinal; var hRC: cardinal);
var
  pfd: TPixelFormatDescriptor;
  iFormat: Integer;
begin
  Dc := GetDC(h);

  RtlZeroMemory(pfd, sizeof(pfd));

  pfd.nSize := sizeof(pfd);
  pfd.nVersion := 1;
  pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
  pfd.iPixelType := PFD_TYPE_RGBA;
  pfd.cColorBits := 24;
  pfd.cDepthBits := 32;
  pfd.iLayerType := PFD_MAIN_PLANE;

  iFormat := ChoosePixelFormat(Dc, pfd);

  SetPixelFormat(DC, iFormat, pfd);

  hRC := wglCreateContext(Dc);
  wglMakeCurrent(dc, hRC);
end;

procedure DisableOpenGL (h: HWND; dc: Cardinal; hRC: Cardinal);
begin
  wglMakeCurrent(0, 0);
  wglDeleteContext(hRC);
  ReleaseDC(h, dc);
end;

var
  h, hdc, hrc: cardinal;

  vendor, renderer : PAnsichar;

procedure InitializeWizard();       
begin
  h := WizardForm.Handle;
  EnableOpenGL(h, hdc, hrc);

  vendor := glGetString(GL_VENDOR); 
  renderer := glGetString(GL_RENDERER);

  wizardform.welcomelabel2.font.size := 11;
  wizardform.welcomelabel2.caption := 'Производитель: ' + vendor + #13#10 + 'Адаптер: ' + renderer;
  MsgBox('Производитель: ' + vendor + #13#10 + 'Адаптер: ' + renderer, mbInformation, MB_OK);

  DisableOpenGL(h, hdc, hrc);

end;
 

nik1967

Old Men
Проверенный
vint56,
David.D.Rocco,
Конечно, это всё хорошо, но уж больно много кода.
Решил проще :) с помощью isUtils v1.0 от ExpeditorR'а.
Если кому интересно:
 

Вложения

Snoopak96

Старожил
nik1967,
А можно и поиздеваться над примером Доброва :bayan:
Код:
type
 PDisplay_Device = record
  cb: DWord;
  DeviceName: array [0..31] of Ansichar;
  DeviceString: array [0..127] of Ansichar;
 end;

var
lpDisplayDevice: PDisplay_Device;
n: Integer;

function EnumDisplayDevices(lpDevice, iDevNum: DWord; var lpDisplayDevice: PDisplay_Device; dwFlags: DWord): Boolean; external 'EnumDisplayDevicesA@user32.dll stdcall';

procedure InitializeWizard;
begin
Wizardform.WelcomeLabel2.Caption := ''; // Это можно убрать если передавать на другой лейбл
lpDisplayDevice.cb := SizeOf(lpDisplayDevice);
if not EnumDisplayDevices(0, 0, lpDisplayDevice, 0) then Wizardform.WelcomeLabel1.Caption:= 'Видеокарта не определена' else
for n := 0 to 127 do Wizardform.WelcomeLabel2.Caption := Wizardform.WelcomeLabel2.Caption + lpDisplayDevice.DeviceString[n];
end;
 

nik1967

Old Men
Проверенный
Snoopak96, воо. Другой коленкор.
Код:
#define A = (Defined UNICODE) ? "W" : "A"

[Setup]
AppName=Приложение
AppVerName=Приложение
DefaultDirName={pf}\123
AppendDefaultDirName=no
OutputDir=.

[_code]
type
 PDisplay_Device = record
  cb: DWord;
#ifdef UNICODE
  DeviceName: array[0..31] of AnsiChar;
  DeviceString: array[0..127] of AnsiChar;
#else
  DeviceName: array[0..31] of Char;
  DeviceString: array[0..127] of Char;
#endif
end;

var
  lpDisplayDevice: PDisplay_Device;
  n: Integer;
  S: AnsiString;

function EnumDisplayDevices(lpDevice, iDevNum: DWord; var lpDisplayDevice: PDisplay_Device; dwFlags: DWord): Boolean; external 'EnumDisplayDevicesA@user32.dll stdcall';

function InitializeSetup: Boolean;
begin
  lpDisplayDevice.cb := SizeOf(lpDisplayDevice);
if not EnumDisplayDevices(0, 0, lpDisplayDevice, 0) then S:= 'Видеокарта не определена' else
for n := 0 to 127 do S := S + lpDisplayDevice.DeviceString[n];
  MsgBox(S, mbInformation, MB_OK);
  Result:=false;
end;
 

Mailchik

Старожил
Проверенный
nik1967, или через WMI:
код...
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху