Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 6]
Извините что досаждаю, можно узнать какой командой прописать иконку в "Установка и удаление программ"?
Raz3r, так тебе чекбокс нужен или чтоб ярлыки устанавливались, когда пользователь не может сам галки выставить (т е в "тихом" режиме)?
Если надо, чтобы ярлык устанавливался автоматически, без пользователя, просто убери
Tasks: desktopicon из параметров ярлыка
Shkutu, Я хотел, чтобы можно было управлять установкой иконок в обычном режиме установки и что бы они автоустанавливались в режиме /silent.
Благо я уже в этом разобрался, спасибо вам.
Напоследок просто хотел спросить как сделать, чтобы было видно иконку в "Установка и удаление программ", а то там не отображается. Наверное потому что программа использует .exe файл другой программы для запуска.
Optitron
16-12-2013, 20:22
Nordek, .reg файл лежит рядом с инсталлятором. Название .reg файла везде одинаковое (1.reg), Убрав Flags, ошибку не выдало, тем менее опять же не занеслось.
Доп. информация: кроме занесения информации из 1.reg инсталлятор заносит в реестр кое-какие данные, но даже если убрать их, то все-равно не занесется.
Shkutu, в вашем методе жалуется на "i", ещё до этого (как я понял) жаловалась на отсутствие begin (добавил begin и end, перестала жаловаться).
как сделать, чтобы было видно иконку в "Установка и удаление программ" »
[Setup]
UninstallDisplayIcon={app}\MyProg.exe
Farser21
16-12-2013, 23:52
Всем привет, возник такой вопрос.
1) Когда наводишь на компонент, то выскакивает картинка, как задать определенные координаты картинке? Задумка сделать все картинки одного размера, и чтобы они выскакивали в одном месте.
Optitron, тот код, что я написала - это просто оператор, который надо вставить в какую либо функцию.\
жалуется на "i" »
Ну да, переменные надо объявлять. Т е в итоге это может выглядеть например так
procedure CurStepChanged(CurStep: tSetupStep);
var i:integer;
begin
if (CurStep=ssPostInstall) then
begin
if FileExists('1.reg') then
Exec(ExpandConstant('{win}') + '\regedit.exe', '1.reg', '', SW_HIDE, ewWaitUntilTerminated, i);
end;
end;
Не могу понять какой код писать в секцию [code], чтобы сделать два чекбокса для двух ярлыков на рабочий стол.
И связывать их одной командой Check: MakeLaunchIcon в [Icons]?
Вот собственно код, но для одного чекбокса:var
QuickLaunchIcon: TCheckBox;
function MakeQuickLaunchIcon: Boolean;
begin
Result:=QuickLaunchIcon.Checked;
end;
procedure InitializeWizard();
begin
LaunchIcon := TCheckBox.Create(WizardForm);
with LaunchIcon do
begin
Parent := WizardForm.SelectDirPage;
Caption := 'Создать значки на рабочем столе';
Left := ScaleX(0);
Top := WizardForm.DirEdit.Top + 117;
Width := ScaleX(300);
Height := ScaleY(15);
TabOrder := 0;
Checked := True;
end;
end;
Raz3r, для 2го чекбокса просто добавить аналогичную конструкцию. Итого
var
QuickLaunchIcon1, QuickLaunchIcon2 : TCheckBox;
procedure InitializeWizard();
begin
QuickLaunchIcon1:= TCheckBox.Create(WizardForm);
with QuickLaunchIcon1do
begin
Parent := WizardForm.SelectDirPage;
Caption := 'Создать значок 1 на рабочем столе';
Left := ScaleX(0);
Top := WizardForm.DirEdit.Top + 97;
Width := ScaleX(300);
Height := ScaleY(15);
TabOrder := 0;
Checked := True;
end;
QuickLaunchIcon2 := TCheckBox.Create(WizardForm);
with QuickLaunchIcon1do
begin
Parent := WizardForm.SelectDirPage;
Caption := 'Создать значок 2 на рабочем столе';
Left := ScaleX(0);
Top := WizardForm.DirEdit.Top + 117;
Width := ScaleX(300);
Height := ScaleY(15);
TabOrder := 0;
Checked := True;
end;
end;
связывать их одной командой Check: MakeLaunchIcon »
Это в смысле, чтобы они выставлялись, если выбраны одновременно?
Тогда
function MakeQuickLaunchIcon: Boolean;
begin
Result:=QuickLaunchIcon1.Checked and QuickLaunchIcon2.Checked;
end;
Если тебе надо, чтобы чекбоксы выбирались по отдельности, то для 2го чекбокса придется написать аналогичную функцию проверки
function MakeQuickLaunchIcon: Boolean;
begin
Result:=QuickLaunchIcon2.Checked;
end;
и использовать в [Icons] ее
файл лежит рядом с инсталлятором. Название .reg файла везде одинаковое (1.reg) »
[Run]
Filename: {win}\regedit.exe; Parameters: "/S ""{src}\1.reg"""; Flags: skipifdoesntexist
Убрав Flags, ошибку не выдало »Знаю почему, проверил.
Farser21, как задать определенные координаты картинке? »
1.
Left := ScaleX(650); // Слева
Top := ScaleY(450); // Сверху
Width := ScaleX(209); // Ширина
Height := ScaleY(169); // Высота
2.
// Left (Слева) Top (Сверху) Width (Ширина) Height (Высота)
SetBounds(ScaleX(650), ScaleY(450), ScaleX(200), ScaleY(200));
Пример:
procedure ShowPicHint(const PicFilePath: String);
var
pt: TPoint;
begin
if not GetCursorPos(pt) then Exit;
InfoPic.Bitmap.LoadFromFile(PicFilePath);
try
with PicForm do
begin
// SetBounds(ScaleX(pt.x + 16), ScaleY(pt.y + 7), InfoPic.Width, InfoPic.Height);
Left := ScaleX(650); // Слева
Top := ScaleY(450); // Сверху
Width := ScaleX(209); // Ширина
Height := ScaleY(169); // Высота
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
SetLayeredWindowAttributes(Handle, 0, ALPHA_BLEND_LEVEL, LWA_ALPHA);
Show;
end;
finally
SetFocus(WizardForm.Handle);
end;
end;
Пример 2:
procedure ShowPicHint(const PicFilePath: String);
var
pt: TPoint;
begin
if not GetCursorPos(pt) then Exit;
InfoPic.Bitmap.LoadFromFile(PicFilePath);
try
with PicForm do
begin
// SetBounds(ScaleX(pt.x + 16), ScaleY(pt.y + 7), InfoPic.Width, InfoPic.Height);
// Left (Слева) Top (Сверху) Width (Ширина) Height (Высота)
SetBounds(ScaleX(650), ScaleY(450), ScaleX(200), ScaleY(200));
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
SetLayeredWindowAttributes(Handle, 0, ALPHA_BLEND_LEVEL, LWA_ALPHA);
Show;
end;
finally
SetFocus(WizardForm.Handle);
end;
end;
Dimas2011
18-12-2013, 18:51
Помогите исправить ошибку http://php-studia.ru/?s=444545.png
Dimas2011, Да, сколько времени прошло?!
Ну вот что тебе, кроме скрина трудно что-ли было кусок кода в месте ошибки скопировать и вставить сюда?
И если делаешь скрин, то делай правильно - чтоб видно было (а то гадай, какая у тебя там процедура).
Тебе так никто помогать не станет, потому что приходится угадывать что у тебя там.
Тем более переписывать код чтоб ты понял (Делаю вывод из того, что когда тебе Shkutu (http://forum.oszone.net/member.php?userid=447029) подсказала (http://forum.oszone.net/post-2273279-1734.html) и ты не понял, то я не знаю. Тебе разжёвывать прямо надо и за тебя съесть. В следующий раз, если попадётся случай. Тоже сделаю скрин кода, да так чтоб ты за ним часа четыре просидел и подумал.), кому охота? Мне точно лень.
Вместо грамотно составленного сообщения, ты продолжаешь одно и тоже сообщение отправлять. Не надоедает?
Остальных, кто делает подобное тоже касается. Если хотите чтоб вам помогли, то составляйте своё сообщение грамотно. И чтоб не приходилось страдать геморроем тем, кто вам помогает.
Так же нужно понимать грань между помогите и сделайте за меня. Помочь можно, но делать за вас никто не будет. Наглеть тоже не нужно, т.е по несколько раз одно и тоже сообщение отправлять. Кто сочтёт нужным - тот обязательно поможет, а нет - так нет.
[hr]
Помогите исправить ошибку »Смотри, ты скопировал а вот вставить толком то не смог.
У тебя было так (примерно):
function InitializeSetup(): Boolean;
begin
Result := InitializeSetup1(); if not Result then exit;
end;
далее, ты скопировал совместил и получилось так:
function InitializeSetup(): Boolean;
begin
Result:= true;
if not RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1') then
MsgBox('Игра {#SetupSetting("AppName")} не найдена! '+#13#10+'Будет предложен альтернативный путь установки, либо укажите путь к папке с игрой вручную!', mbinformation, mb_ok);
end;
begin
Result := InitializeSetup1(); if not Result then exit;
end;
твоя ошибка находится здесь (отметил красным и выделил жирным):
function InitializeSetup(): Boolean;
begin
Result:= true;
if not RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1') then
MsgBox('Игра {#SetupSetting("AppName")} не найдена! '+#13#10+'Будет предложен альтернативный путь установки, либо укажите путь к папке с игрой вручную!', mbinformation, mb_ok);
end;
begin
Result := InitializeSetup1(); if not Result then exit;
end;
и то что отмечено красным, нужно было удалить.
Итог твоего кода должен был получиться таким:
function InitializeSetup(): Boolean;
begin
Result:= true;
if not RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1') then
MsgBox('Игра {#SetupSetting("AppName")} не найдена! '+#13#10+'Будет предложен альтернативный путь установки, либо укажите путь к папке с игрой вручную!', mbinformation, mb_ok);
Result := InitializeSetup1(); if not Result then exit;
end;
Всем доброго времени суток!
Есть проблема: нужно устанавливать IIS в процессе инсталляции. Если использовать [Run], то все отлично
[Run]
Filename: "pkgmgr"; Parameters: "/iu:IIS-WebServerRole;IIS-WebServer;IIS-CommonHttpFeatures;IIS-StaticContent;IIS-DefaultDocument;IIS-DirectoryBrowsing;IIS-HttpErrors;IIS-HttpRedirect;IIS-ApplicationDevelopment;IIS-ASPNET;IIS-NetFxExtensibility;IIS-ASP;IIS-CGI;IIS-ISAPIExtensions;IIS-ISAPIFilter;IIS-ServerSideIncludes;IIS-HealthAndDiagnostics;IIS-HttpLogging;IIS-LoggingLibraries;IIS-RequestMonitor;IIS-HttpTracing;IIS-CustomLogging;IIS-Security;IIS-BasicAuthentication;IIS-URLAuthorization;IIS-RequestFiltering;IIS-IPSecurity;IIS-Performance;IIS-HttpCompressionStatic;IIS-HttpCompressionDynamic;IIS-WebServerManagementTools;IIS-ManagementConsole;IIS-ManagementScriptingTools;IIS-ManagementService;IIS-IIS6ManagementCompatibility;IIS-Metabase;IIS-WMICompatibility;IIS-LegacyScripts;IIS-LegacySnapIn;WAS-WindowsActivationService;WAS-ProcessModel;WAS-NetFxEnvironment;WAS-ConfigurationAPI"; Description: "Install IIS"; Flags: 64bit; Check: IsWin64;
Filename: "pkgmgr"; Parameters: "/iu:IIS-WebServerRole;IIS-WebServer;IIS-CommonHttpFeatures;IIS-StaticContent;IIS-DefaultDocument;IIS-DirectoryBrowsing;IIS-HttpErrors;IIS-HttpRedirect;IIS-ApplicationDevelopment;IIS-ASPNET;IIS-NetFxExtensibility;IIS-ASP;IIS-CGI;IIS-ISAPIExtensions;IIS-ISAPIFilter;IIS-ServerSideIncludes;IIS-HealthAndDiagnostics;IIS-HttpLogging;IIS-LoggingLibraries;IIS-RequestMonitor;IIS-HttpTracing;IIS-CustomLogging;IIS-Security;IIS-BasicAuthentication;IIS-URLAuthorization;IIS-RequestFiltering;IIS-IPSecurity;IIS-Performance;IIS-HttpCompressionStatic;IIS-HttpCompressionDynamic;IIS-WebServerManagementTools;IIS-ManagementConsole;IIS-ManagementScriptingTools;IIS-ManagementService;IIS-IIS6ManagementCompatibility;IIS-Metabase;IIS-WMICompatibility;IIS-LegacyScripts;IIS-LegacySnapIn;WAS-WindowsActivationService;WAS-ProcessModel;WAS-NetFxEnvironment;WAS-ConfigurationAPI"; Description: "Install IIS"; Flags: 32bit; Check: not IsWin64;
Но т к установка IIS требуется в самом начале инсталляции, до других операций, то приходится выносить это в Execute
Exec(ExpandConstant('{sys}\pkgmgr'),
'/iu:IIS-WebServerRole;IIS-WebServer;IIS-CommonHttpFeatures;IIS-StaticContent;IIS-DefaultDocument;IIS-DirectoryBrowsing;IIS-HttpErrors;IIS-HttpRedirect;IIS-ApplicationDevelopment;IIS-ASPNET;IIS-NetFxExtensibility;IIS-ASP;IIS-CGI;IIS-ISAPIExtensions;IIS-ISAPIFilter;IIS-ServerSideIncludes;IIS-HealthAndDiagnostics;IIS-HttpLogging;IIS-LoggingLibraries;IIS-RequestMonitor;IIS-HttpTracing;IIS-CustomLogging;IIS-ODBCLogging;IIS-Security;IIS-BasicAuthentication;IIS-WindowsAuthentication;IIS-DigestAuthentication;IIS-ClientCertificateMappingAuthentication;IIS-IISCertificateMappingAuthentication;IIS-URLAuthorization;IIS-RequestFiltering;IIS-IPSecurity;IIS-Performance;IIS-HttpCompressionStatic;IIS-HttpCompressionDynamic;IIS-WebServerManagementTools;IIS-ManagementConsole;IIS-ManagementScriptingTools;IIS-ManagementService;IIS-IIS6ManagementCompatibility;IIS-Metabase;IIS-WMICompatibility;IIS-LegacyScripts;IIS-LegacySnapIn;IIS-FTPPublishingService;IIS-FTPServer;IIS-FTPManagement;WAS-WindowsActivationService;WAS-ProcessModel;WAS-NetFxEnvironment;WAS-ConfigurationAPI',
'', SW_SHOW, ewWaitUntilTerminated, i);
При этом оно ругается на попытку загрузки файла, имеющего неверный формат. Судя по всему он пытается использовать версию менеджера/пакетов с неверной разрядностью. Собственно, вопрос: можно ли как-то для Execute указать необходимую разрядность аналогично Run. Можно было бы использовать вилку с IsWin64, но пока не пойму, как это правильнее сделать. Может, кто-то подскажет?
Farser21
19-12-2013, 21:07
Nordek, спасибо!
Господа. Кому не жалко поделитесь, пожалуйста, скриптом сколько скопировано мегабайт/гегабайт из инсталлятора.
Собственно, вопрос: можно ли как-то для Execute указать необходимую разрядность аналогично Run »
Если я правильно понял...
function InitializeSetup(): Boolean;
begin
if isWin64 then...
else...
end;
Respin, я видимо, не совсем корректно задаю вопросы :)
И так понятно, что это надо как-то через вилку с isWin64. Проблема в другом. Когда запуск идет из секции [Run], инно сам знает в какую системную директорию лезть и какую версию пакета (соответствующую разрядности) брать и например константа {sys} будет указывать на системную директорию правильной разрядности. Когда речь об Execute, эти директории надо как-то определить самостоятельно, потому что та же {sys} будет указывать на директорию для 32 бит, даже в 64 битной системе.
использовать вилку с IsWin64, но пока не пойму, как это правильнее сделать. »
Это в том смысле, какие в каком случае (32/64 бит) директории юзать. Или есть ли какой флаг или еще что, что можно использовать кроме isWin64.
Кому не жалко поделитесь, пожалуйста, скриптом сколько скопировано мегабайт/гегабайт из инсталлятора. »
[Setup]
AppName=MyProg
AppVerName=MyProg
DefaultDirName={pf}\MyProg
[Files]
Source: innocallback.dll; Flags: dontcopy
Source: {win}\Help\*; DestDir: {app}; Flags: external recursesubdirs;
[ Сode]
const
oneMB=1024*1024;
type
TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);
var
FullSize: Extended;
TimerID: LongWord;
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('%.2n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
SetLength(Result, Length(Result)-1);
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 ByteOrTB(Bytes: Extended; noMB: Boolean): String; {Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 2х знаков после запятой)}
Begin
if not noMB then Result:= NumToStr(Int(Bytes)) +' Mb' else
if Bytes < 1024 then if Bytes = 0 then Result:= '0' else Result:= NumToStr(Int(Bytes)) +' Bt' else
if Bytes/1024 < 1024 then Result:= NumToStr(round((Bytes/1024)*10)/10) +' Kb' else
If Bytes/oneMB < 1024 then Result:= NumToStr(round(Bytes/oneMB*100)/100) +' Mb' else
If Bytes/oneMB/1000 < 1024 then Result:= NumToStr(round(Bytes/oneMB/1024*1000)/1000) +' Gb' else
Result:= NumToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Tb';
End;
function CalcDirSize(const fromDir, fileMask: string; SubDirsAllow: Boolean): Extended;
var
FSR, DSR: TFindRec; FindResult: Boolean; APath: string;
Begin
APath:= AddBackslash(fromDir);
FindResult:= FindFirst(APath + fileMask, FSR);
Try
while FindResult do
begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then Result:= Result + Size64(FSR.SizeHigh, FSR.SizeLow)
FindResult:= FindNext(FSR);
end;
FindResult := FindFirst(APath + '*.*', DSR);
while FindResult and SubDirsAllow do
begin
if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and not ((DSR.Name = '.') or (DSR.Name = '..')) then
{Recursion} Result:= Result + CalcDirSize(APath + DSR.Name, fileMask, SubDirsAllow);
// если есть хоть одна рекурсия, то подсчёт почему-то не прерывается
FindResult:= FindNext(DSR);
end;
Finally
FindClose(FSR); FindClose(DSR);
end;
End;
procedure GetExtractSize();
begin
//Так как ClcDirSize суммирует полученные размеры, то сначала обнуляем счетчик
FullSize:=0;
FullSize:=CalcDirSize(ExpandConstant('{app}'), '*', true)
WizardForm.StatusLabel.Caption:= 'Общий объем извлеченных файлов ' + ByteOrTB(FullSize, true)
end;
Procedure MyTimerProc(h, msg, idevent, dwTime: Longword);
Begin
if WizardForm.CurPageID = wpInstalling then GetExtractSize();
End;
procedure DeinitializeSetup();
begin
KillTimer(0, TimerID);
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
TimerID:= SetTimer(0, 0, 500 {полсекунды}, WrapTimerProc(@MyTimerProc, 4));
end;
end;
Это в том смысле, какие в каком случае (32/64 бит) директории юзать. »
Если я тоже правильно понял...
[Setup]
AppName=AppName
AppVerName=AppVerName
DefaultDirName={pf}\AppName
[ Code]
function InitializeSetup: Boolean;
begin
// Check IsWin64 before using a 64-bit-only feature to
// avoid an exception when running on 32-bit Windows.
if IsWin64 then
MsgBox('64-bit program files reside in: ' +
ExpandConstant('{pf64}'), mbInformation, MB_OK)
else
MsgBox('32-bit program files reside in: ' +
ExpandConstant('{pf32}'), mbInformation, MB_OK);
result:=true;
end;
Tco 03, почти:)
С Program files все понятно. А что делать с {sys} (для установки ISS нужна именно она)? Она и в 32 и 64 указывает на одно и то же место - system32 для 32 бит.
А что делать с {sys} (для установки ISS нужна именно она)? Она и в 32 и 64 указывает на одно и то же место »
Тогда наверное так:
[Setup]
AppName=AppName
AppVerName=AppVerName
DefaultDirName={pf}\AppName
[ Code]
const
MAX_PATH = 260;
CSIDL_SYSTEM = $25;
CSIDL_SYSTEMX86 = $29;
function SHGetSpecialFolderPath(hwndOwner: HWND; lpszPath: PChar; nFolder: Integer; fCreate: BOOL): BOOL; external 'SHGetSpecialFolderPathA@shell32.dll stdcall';
function GetSpecialPath(CSIDL: Word): String;
var
s: String;
begin
SetLength(s, MAX_PATH);
if not SHGetSpecialFolderPath(0, PChar(s), CSIDL, True) then s := '';
Result:= PChar(s);
end;
function InitializeSetup: Boolean;
begin
if IsWin64 then
MsgBox(GetSpecialPath(CSIDL_SYSTEMX86), mbInformation, MB_OK)
else
MsgBox(GetSpecialPath(CSIDL_SYSTEM), mbInformation, MB_OK);
Result:= True;
end;
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC