Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 7]
Dodakaedr
12-11-2014, 19:33
только вот что странно, Dodakaedr, с твоим кодом запускается только черная рамка »
Действительно странно, но у меня все нормально работает.
El Sanchez
13-11-2014, 16:41
Какой самый простой способ добавление всплывчатой картинки и с затуханием »
diman_21Ru, сплэш для битмапов, в том числе и c premultiplied alpha.
[Setup]
AppName=test
AppVerName=test
DefaultDirName={tmp}
CreateAppDir=no
Uninstallable=no
CreateUninstallRegKey=no
BitmapResource=splash:compiler:WizModernImage.bmp
[Languages]
Name: ru; MessagesFile: compiler:Languages\russian.isl
[Code]
#define A = (Defined UNICODE) ? "W" : "A"
const
AC_SRC_OVER = $0;
AC_SRC_ALPHA = $1;
ULW_ALPHA = $2;
SM_CXSCREEN = 0;
SM_CYSCREEN = 1;
WS_EX_LAYERED = $80000;
GWL_EXSTYLE = (-20);
WM_CLOSE = $10;
type
BLENDFUNCTION = record
BlendOp: Byte;
BlendFlags: Byte;
SourceConstantAlpha: Byte;
AlphaFormat: Byte;
end;
TIMERPARAM = record // user defined
bmp: TBitmap;
bf: BLENDFUNCTION;
dwStart: DWORD;
dwFadeIn: DWORD;
dwNormal: DWORD;
dwFadeOut: DWORD;
end;
// Window Functions
function UpdateLayeredWindow(hwnd: HWND; hdcDst: THandle; pptDst, psize: TPoint; hdcSrc: THandle; pptSrc: TPoint; crKey: DWORD; pblend: BLENDFUNCTION; dwFlags: DWORD): BOOL; external 'UpdateLayeredWindow@user32.dll stdcall delayload';
// Configuration Reference
function GetSystemMetrics(nIndex: Integer): Integer; external 'GetSystemMetrics@user32.dll stdcall';
// Large Integer Functions
function MulDiv(nNumber, nNumerator, nDenominator: Integer): Integer; external 'MulDiv@kernel32.dll stdcall';
// Window Class Functions
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLong{#A}@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
// Time Functions
function GetSystemTimeAdjustment(var lpTimeAdjustment, lpTimeIncrement, lpTimeAdjustmentDisabled: DWORD): BOOL; external 'GetSystemTimeAdjustment@kernel32.dll stdcall';
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';
// Timer Functions
function SetTimer(hWnd: HWND; var nIDEvent: TIMERPARAM; uElapse: UINT; lpTimerFunc: Longint): UINT_PTR; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd: HWND; var uIDEvent: TIMERPARAM): BOOL; external 'KillTimer@user32.dll stdcall';
/////////////////////////////////////////////////////////////////////////////////////////
procedure SplashTimerProc(hwnd: HWND; uMsg: UINT; var wParam: TIMERPARAM; dwTime: DWORD);
var
dwCurrentTime: DWORD;
ptSize, ptSrc, ptDst: TPoint;
begin
{ get coords }
ptDst.x := (GetSystemMetrics(SM_CXSCREEN) - wParam.bmp.Width) shr 1;
ptDst.y := (GetSystemMetrics(SM_CYSCREEN) - wParam.bmp.Height) shr 1;
ptSize.x := wParam.bmp.Width;
ptSize.y := wParam.bmp.Height;
{ current time }
dwCurrentTime := dwTime - wParam.dwStart;
{ kill timer }
if dwCurrentTime > wParam.dwFadeIn + wParam.dwNormal + wParam.dwFadeOut then
begin
KillTimer(hwnd, wParam);
SendMessage(hwnd, WM_CLOSE, 0, 0);
end;
{ fade in }
if dwCurrentTime < wParam.dwFadeIn then
begin
wParam.bf.SourceConstantAlpha := MulDiv($FF, dwCurrentTime, wParam.dwFadeIn + 1);
UpdateLayeredWindow(hwnd, 0, ptDst, ptSize, wParam.bmp.Canvas.Handle, ptSrc, 0, wParam.bf, ULW_ALPHA);
end;
{ normal }
if (dwCurrentTime > wParam.dwFadeIn) and (dwCurrentTime < wParam.dwFadeIn + wParam.dwNormal) then
begin
wParam.bf.SourceConstantAlpha := $FF;
UpdateLayeredWindow(hwnd, 0, ptDst, ptSize, wParam.bmp.Canvas.Handle, ptSrc, 0, wParam.bf, ULW_ALPHA);
end;
{ fade out }
if dwCurrentTime > wParam.dwFadeIn + wParam.dwNormal then
begin
wParam.bf.SourceConstantAlpha := $FF - MulDiv($FF, dwCurrentTime - wParam.dwFadeIn - wParam.dwNormal, wParam.dwFadeOut + 1);
UpdateLayeredWindow(hwnd, 0, ptDst, ptSize, wParam.bmp.Canvas.Handle, ptSrc, 0, wParam.bf, ULW_ALPHA);
end;
end;
/////////////////////////////////////////////////////
function GetBitmapBitCount(const bmp: TBitmap): WORD;
var
MemStream: TMemoryStream;
szBuffer: String;
begin
Result := -1;
MemStream := TMemoryStream.Create;
try
bmp.SaveToStream(MemStream);
MemStream.Position := $1C; // biBitCount member of BITMAPINFOHEADER struct offset
szBuffer := StringOfChar(#0, 1);
if MemStream.Read(szBuffer, 1) = 1 then
Result := Ord(szBuffer[1]);
finally
MemStream.Free;
end;
end;
/////////////////////////////////////////////////////////////////
procedure ShowSplash(const dwFadeIn, dwNormal, dwFadeOut: DWORD);
// dwFadeIn..: fade in stage in ms
// dwNormal..: normal stage in ms
// dwFadeOut : fade out stage in ms
var
lpTimeAdjustment, lpTimeIncrement, lpTimeAdjustmentDisabled: DWORD;
tp: TIMERPARAM;
begin
if WizardSilent then Exit;
{ load bitmap }
tp.bmp := TBitmap.Create;
TBitmap(tp.bmp).LoadFromResourceName(HInstance, '_IS_SPLASH');
{ get bitmap bit count }
case GetBitmapBitCount(tp.bmp) of
-1: begin
tp.bmp.Free;
Exit;
end;
32: tp.bf.AlphaFormat := AC_SRC_ALPHA;
end;
{ create splash form }
with TForm.Create(nil) do
begin
BorderStyle := bsNone;
FormStyle := fsStayOnTop;
Position := poScreenCenter;
{ set dimensions }
Width := tp.bmp.Width;
Height := tp.bmp.Height;
{ set layered exstyle }
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
{ get minimal timer interval }
GetSystemTimeAdjustment(lpTimeAdjustment, lpTimeIncrement, lpTimeAdjustmentDisabled);
{ fill user defined struct }
tp.bf.BlendOp := AC_SRC_OVER;
tp.dwStart := GetTickCount;
tp.dwFadeIn := dwFadeIn;
tp.dwNormal := dwNormal;
tp.dwFadeOut := dwFadeOut;
{ start timer }
SetTimer(Handle, tp, lpTimeIncrement div 10000, CallbackAddr('SplashTimerProc'));
{ show form }
ShowModal;
{ cleanup }
tp.bmp.Free;
Free;
end;
end;
//////////////////////////////////
function InitializeSetup: Boolean;
begin
ShowSplash(1000, 2000, 1000);
Result := True;
end;
И так этот замечательный код (написанный на Delphi) позволяет вам вызвать ЛЮБУЮ функцию из вашего скрипта! »
VoLT, во-первых, тестовый скрипт ведет к AV, во-вторых, никакой это не callback.
ROMKA-1977
13-11-2014, 20:55
Подскажите возможно ли сделать кнопу закрытия окна инсталятора (верхний правый угол) не активной ?
Подскажите возможно ли сделать кнопу закрытия окна инсталятора (верхний правый угол) не активной ? »
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=...
[Code]
#define A = (Defined UNICODE) ? "W" : "A"
const
GCL_STYLE = - 26;
CS_NOCLOSE = $0200;
function SetClassLong( hWnd: HWND; nIndex: Integer; dwNewLong: Longint ): DWORD; external 'SetClassLong{#A}@user32.dll stdcall';
function GetClassLong( hWnd: HWND; nIndex: Integer ): DWORD; external 'GetClassLong{#A}@user32.dll stdcall';
procedure InitializeWizard();
begin
SetClassLong( WizardForm.Handle, GCL_STYLE, ( GetClassLong( WizardForm.Handle, GCL_STYLE ) or CS_NOCLOSE ) );
end;
saneksanek
15-11-2014, 14:30
Здравствуйте,возможно-ли в данный код добавить функцию,чтобы автоматом не выбирались компоненты над которыми работает код.
Пробовал flags "dontinheritcheck" но его нельзя совмещать с "exclusive"
[Types]
Name: viborochnaya; Description: Выборочная установка; Flags: iscustom
[Components]
Name: AB;Description: Группы A и B;Flags: exclusive
Name: AB\A; Description: Группа A
Name: AB\A\A1; Description: Компонент 1;Flags: exclusive
Name: AB\A\A2; Description: Компонент 2;Flags: exclusive
Name: AB\A\A3; Description: Компонент 3;Flags: exclusive
Name: AB\A\A4; Description: Компонент 4;Flags: exclusive
Name: AB\B; Description: Группа B
Name: AB\B\B1; Description: Компонент 1;Flags: exclusive
Name: AB\B\B2; Description: Компонент 2;Flags: exclusive
Name: AB\B\B3; Description: Компонент 2;Flags: exclusive
Name: AB\B\B4; Description: Компонент 4;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[1] and WizardForm.ComponentsList.Checked[0]
begin
Result:=WizardForm.ComponentsList.ItemEnabled[2] and WizardForm.ComponentsList.Checked[0]
end
end;
function Check2: Boolean;
begin
Result:=WizardForm.ComponentsList.ItemEnabled[4] and WizardForm.ComponentsList.Checked[3]
begin
Result:=WizardForm.ComponentsList.ItemEnabled[5] and WizardForm.ComponentsList.Checked[3]
end
end;
procedure OnClickCheck(Sender: TObject);
begin
if WizardForm.ComponentsList.Checked[1] = True then
begin
WizardForm.ComponentsList.ItemEnabled[6]:=False
WizardForm.ComponentsList.ItemEnabled[7]:=False
WizardForm.ComponentsList.ItemEnabled[8]:=False
WizardForm.ComponentsList.ItemEnabled[9]:=False
WizardForm.ComponentsList.ItemEnabled[10]:=False
end else
begin
WizardForm.ComponentsList.ItemEnabled[6]:=True
WizardForm.ComponentsList.ItemEnabled[7]:=True
WizardForm.ComponentsList.ItemEnabled[8]:=True
WizardForm.ComponentsList.ItemEnabled[9]:=True
WizardForm.ComponentsList.ItemEnabled[10]:=True
end
if WizardForm.ComponentsList.Checked[6] = True then
begin
WizardForm.ComponentsList.ItemEnabled[1]:=False
WizardForm.ComponentsList.ItemEnabled[2]:=False
WizardForm.ComponentsList.ItemEnabled[3]:=False
WizardForm.ComponentsList.ItemEnabled[4]:=False
WizardForm.ComponentsList.ItemEnabled[5]:=False
end else
begin
WizardForm.ComponentsList.ItemEnabled[1]:=True
WizardForm.ComponentsList.ItemEnabled[2]:=True
WizardForm.ComponentsList.ItemEnabled[3]:=True
WizardForm.ComponentsList.ItemEnabled[4]:=True
WizardForm.ComponentsList.ItemEnabled[5]:=True
end
end;
procedure InitializeWizard();
begin
WizardForm.ComponentsList.Checked[1]:=True
WizardForm.ComponentsList.Checked[6]:=True
WizardForm.ComponentsList.OnClickCheck:=@OnClickCheck
end;
Dodakaedr
15-11-2014, 17:46
чтобы автоматом не выбирались компоненты над которыми работает код »
Что-то ничего не понял... Как это?
saneksanek
15-11-2014, 19:49
Dodakaedr, Данный код блокирует другие компоненты при выборе того или иного компонента,в данном случае если выбрать группу А закроется группа Б и на оборот,на те компоненты которые подключены к коду выбираются автоматом.
Из-за этого выходит так что стоят галки в компонентах и А и Б а мне это не нужна так как все эти файлы не совместимы с друг-другом.
Забыл..что нужно написать, чтобы было не ниже Seven sp1
MinVersion: xxxxxx
Dodakaedr
15-11-2014, 20:45
Из-за этого выходит так что стоят галки в компонентах и А и Б а мне это не нужна так как все эти файлы не совместимы с друг-другом. »
Может так сойдет?...[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
[Languages]
Name: "default"; MessagesFile: "compiler:Default.isl"
[Types]
Name: viborochnaya; Description: Выборочная установка; Flags: iscustom
[Components]
Name: AB;Description: Группы A и B;Flags: exclusive
Name: AB\A; Description: Группа A
Name: AB\A\A1; Description: Компонент 1;Flags: exclusive
Name: AB\A\A2; Description: Компонент 2;Flags: exclusive
Name: AB\A\A3; Description: Компонент 3;Flags: exclusive
Name: AB\A\A4; Description: Компонент 4;Flags: exclusive
Name: AB\B; Description: Группа B
Name: AB\B\B1; Description: Компонент 1;Flags: exclusive
Name: AB\B\B2; Description: Компонент 2;Flags: exclusive
Name: AB\B\B3; Description: Компонент 2;Flags: exclusive
Name: AB\B\B4; Description: Компонент 4;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[1] and WizardForm.ComponentsList.Checked[0];
begin
Result:=WizardForm.ComponentsList.ItemEnabled[2] and WizardForm.ComponentsList.Checked[0];
end;
end;
function Check2: Boolean;
begin
Result:=WizardForm.ComponentsList.ItemEnabled[4] and WizardForm.ComponentsList.Checked[3];
begin
Result:=WizardForm.ComponentsList.ItemEnabled[5] and WizardForm.ComponentsList.Checked[3];
end;
end;
procedure OnClickCheck(Sender: TObject);
begin
if WizardForm.ComponentsList.Checked[1] = True then
begin
WizardForm.ComponentsList.ItemEnabled[6]:=False;
WizardForm.ComponentsList.ItemEnabled[7]:=False;
WizardForm.ComponentsList.ItemEnabled[8]:=False;
WizardForm.ComponentsList.ItemEnabled[9]:=False;
WizardForm.ComponentsList.ItemEnabled[10]:=False;
end else
begin
WizardForm.ComponentsList.ItemEnabled[6]:=True;
WizardForm.ComponentsList.ItemEnabled[7]:=True;
WizardForm.ComponentsList.ItemEnabled[8]:=True;
WizardForm.ComponentsList.ItemEnabled[9]:=True;
WizardForm.ComponentsList.ItemEnabled[10]:=True;
end;
if WizardForm.ComponentsList.Checked[6] = True then
begin
WizardForm.ComponentsList.ItemEnabled[1]:=False;
WizardForm.ComponentsList.ItemEnabled[2]:=False;
WizardForm.ComponentsList.ItemEnabled[3]:=False;
WizardForm.ComponentsList.ItemEnabled[4]:=False;
WizardForm.ComponentsList.ItemEnabled[5]:=False;
end else
begin
WizardForm.ComponentsList.ItemEnabled[1]:=True;
WizardForm.ComponentsList.ItemEnabled[2]:=True;
WizardForm.ComponentsList.ItemEnabled[3]:=True;
WizardForm.ComponentsList.ItemEnabled[4]:=True;
WizardForm.ComponentsList.ItemEnabled[5]:=True;
end;
end;
procedure InitializeWizard();
begin
WizardForm.ComponentsList.Checked[1]:=True;
WizardForm.ComponentsList.ItemEnabled[6]:=False;
WizardForm.ComponentsList.ItemEnabled[7]:=False;
WizardForm.ComponentsList.ItemEnabled[8]:=False;
WizardForm.ComponentsList.ItemEnabled[9]:=False;
WizardForm.ComponentsList.ItemEnabled[10]:=False;
WizardForm.ComponentsList.OnClickCheck:=@OnClickCheck;
end;
Всем привет :) Подскажите пожалуйста команду, чтобы приложение автоматически установилось в папку "Мои документы". То есть я установила приложение с офсайта и оно у меня автоматически установилось по пути C:\Users\Ирина\Documents\TMClientProfile. А теперь мне нужно сделать установщик, который бы тоже автоматически устанавливал программу по тому же пути.
Ранее уже как то задавалась этим вопросом, но тогда мне нужно было, чтобы программа установилась в папку ProgramData. Оказалось, все очень просто:
Source: "C:\ProgramData\Firefly Studios\*"; DestDir: "{commonappdata}\Firefly Studios"; Flags: ignoreversion recursesubdirs createallsubdirs
В общем, может есть какой то код, чтоб приложение устанавливалось в папку "Мои документы" по умолчанию? Спасибо.
Подскажите пожалуйста команду, чтобы приложение автоматически установилось в папку "Мои документы". »Irenis, Используй {userdocs}
Пример:
[Files]
Source: compiler:Languages\Russian.isl; DestDir: {userdocs}\Inno Setup 5; Flags: ignoreversion
и/или
[Files]
Source: compiler:Languages\*; DestDir: {userdocs}\Inno Setup 5; Flags: ignoreversion recursesubdirs createallsubdirs
saneksanek
16-11-2014, 02:18
Dodakaedr, То что надо спс
Забыл..что нужно написать, чтобы было не ниже Seven sp1
MinVersion: xxxxxx »
6.1.7601
До кучи, проверка через код с помощью GetVersionEx:
[CustomMessages]
IS_WINDOWS_SEVEN_TITLE=Неподдерживаемая операционная система
IS_WINDOWS_SEVEN_MSG=Устанавливаемое приложение несовместимо%nс используемой версией Windows.
[Code]
#define A = (Defined UNICODE) ? "W" : "A"
const
MB_ICONNONE = $00000000;
MB_ICONSTOP = $00000010;
MB_ICONEXCLAMATION = $00000030;
MB_ICONASTERISK = $00000040;
MB_CANCELTRYCONTINUE = $00000006;
MB_APPLMODAL = $00000000;
MB_SYSTEMMODAL = $00001000;
MB_TASKMODAL = $00002000;
MB_RIGHT = $00080000;
IDTRYAGAIN = 10;
IDCONTINUE = 11;
VER_PLATFORM_WIN32_NT = 2;
type
_OSVERSIONINFOEX = record
dwOSVersionInfoSize: DWORD;
dwMajorVersion: DWORD;
dwMinorVersion: DWORD;
dwBuildNumber: DWORD;
dwPlatformId: DWORD;
szCSDVersion: array [0..127] of Char;
wServicePackMajor: WORD;
wServicePackMinor: WORD;
wSuiteMask: WORD;
wProductType: BYTE;
wReserved: BYTE;
end;
function MessageBox( HWND: hWnd; lpText: String; lpCaption: String; uType: UINT ): Integer; external 'MessageBox{#A}@user32.dll stdcall';
function GetVersionEx( var lpVersionInformation: _OSVERSIONINFOEX ): BOOL; external 'GetVersionEx{#A}@kernel32.dll stdcall';
function IsWindowsSevenSPOneOnly(): Boolean; // только Windows 7 SP1
var
osviEx: _OSVERSIONINFOEX;
begin
osviEx.dwOSVersionInfoSize := SizeOf( osviEx );
if ( not GetVersionEx( osviEx ) ) then
Exit;
Result := ( ( osviEx.dwPlatformId = VER_PLATFORM_WIN32_NT ) and // платформа NT
( osviEx.dwMajorVersion = 6 ) and // версия системы
( osviEx.dwMinorVersion = 1 ) and
( osviEx.wServicePackMajor = 1 ) ); // версия SP
if not Result then
MessageBox( Application.Handle, CustomMessage( 'IS_WINDOWS_SEVEN_MSG' ), CustomMessage( 'IS_WINDOWS_SEVEN_TITLE' ), ( MB_OK + MB_ICONEXCLAMATION + MB_DEFBUTTON1 + MB_APPLMODAL ) );
end;
function InitializeSetup(): Boolean;
begin
Result := IsWindowsSevenSPOneOnly();
end;
Кто знает как это решить. После установки игры на мой ПК игра запускается, если установить на другой ПК, ничего не происходит, что делать?
Что то в реестр я слышал вносить нужно мб(
Dodakaedr
17-11-2014, 16:20
Кто знает как это решить. После установки игры на мой ПК игра запускается, если установить на другой ПК, ничего не происходит, что делать?
Что то в реестр я слышал вносить нужно мб( »
Может и реестр, может и дополнительное программное обеспечение, может доп. файлы где-то в системе. Много вариантов...
естественнО в реестр нужно вносить что-то, а что именно - зависит от самой игры. regedit вводишь в поиске и ищешь там уже. если нужно распишу подробнее, что и куда смотреть
Возник вопрос по установке дополнительного ПО. Подскажите пожалуйста, как это все организовать? Конкретно, нужно чтобы при установке игры, автоматически установилось Microsoft Visual C++. Какой код в скрипте должен быть?
Dodakaedr
17-11-2014, 17:33
Конкретно, нужно чтобы при установке игры, автоматически установилось Microsoft Visual C++. Какой код в скрипте должен быть? »
Примеры для обозрения:
[Run]
Filename: {src}\vcredist_x86.exe; Parameters: /q; StatusMsg: Установка Microsoft Visual С++ 2005 Redistributable;
Filename: {src}\vcredist_x64.exe; Parameters: /q; Check: "IsWin64"; StatusMsg: Установка Microsoft Visual С++ 2005 Redistributable x64;
[Tasks]
Name: Soft; Description: Установка дополнительного программного обеспечения; GroupDescription: Дополнительное программное обеспечение:; Flags: unchecked
Name: Soft/vcredist_x86; Description: Microsoft Visual С++ 2005 Redistributable; Flags: unchecked
Name: Soft/vcredist_x64; Description: Microsoft Visual С++ 2005 Redistributable x64; Flags: unchecked; Check: IsWin64
[Run]
Filename: {src}\vcredist_x86.exe; Tasks: Soft/vcredist_x86; Parameters: /q; StatusMsg: Установка Microsoft Visual С++ 2005 Redistributable;
Filename: {src}\vcredist_x64.exe; Tasks: Soft/vcredist_x64; Parameters: /q; StatusMsg: Установка Microsoft Visual С++ 2005 Redistributable x64;
Файлы должны находится возле установщика.
естественнО в реестр нужно вносить что-то, а что именно - зависит от самой игры. regedit вводишь в поиске и ищешь там уже. если нужно распишу подробнее, что и куда смотреть »
если можно поподробнее напишите в ЛС, спасибо
saneksanek
17-11-2014, 20:50
Dodakaedr, Можете-ли очистить часть сохраненных персональных сообщений а то в приват не написать.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC