Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 6]
ToBeLife
16-07-2013, 01:31
Доброго времени суток. Помогите реализовать:
необходимо, чтобы в процессе установки копировалось содержимое компонента 1, затем запускался exe-файл, (если выбраны оба компонента) компируется содержимое компонента 2 и снова запускается тот же exe-файл. Но по умолчанию в инно, в начале скопируются файлы (содержимое) и только потом запустится секция run.
файл 1 - запуск exe - файл 2 - запуск exe
Возможно я не вижу элементарного, подскажите, как это реализовать.
Но по умолчанию в инно, в начале скопируются файлы (содержимое) и только потом запустится секция run.
файл 1 - запуск exe - файл 2 - запуск exe »
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=none
[Components]
Name: a; Description: Компонент 1; Types: full
Name: b; Description: Компонент 2; Types: custom
[Files]
;Компонент 1
Source: c:\windows\fonts\*; DestDir: {app}; Components: a; Flags: ignoreversion external;
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Afterinstall: My_Exec(1); Components: a; Flags: ignoreversion;
;Компонент 2
Source: c:\windows\help\*; DestDir: {app}; Components: b; Flags: recursesubdirs overwritereadonly createallsubdirs ignoreversion external;
Source: compiler:Examples\MyProg.exe; DestDir: {app}; DestName: MyProg2.exe; Afterinstall: My_Exec(2); Components: b; Flags: ignoreversion;
[Code]
procedure My_Exec(const Number: Integer);
var
i: Integer;
begin
case Number of
1: Exec(ExpandConstant('{app}\MyProg.exe'), '', ExpandConstant('{app}'), 5, ewWaitUntilTerminated, i); //Ексишник первого компонента с ожиданием
2: Exec(ExpandConstant('{app}\MyProg2.exe'), '', ExpandConstant('{app}'), 5, ewWaitUntilTerminated, i); //Ексишник второго компонента с ожиданием
end;
end;
Всем привет :hi: Есть ли возможность вывести в кастомный лейбл имена копируемых файлов(не полный путь, а имя конечной папки и текущего копируемого файла), когда для них установлен флаг external? CurrentFileName, ExtractFileDir, ExtractRelativePath в данном случае не работают.
Johny777
17-07-2013, 21:28
saurn, Так можно:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application\My Application\My Application\My Application\My Application\My Application\My Application\My Application\My Application\My Application\My Application777
[Files]
Source: {fonts}\*; DestDir: {app}; Flags: external;
[Code ]
#define A = (Defined UNICODE) ? "W" : "A"
const
GWL_WNDPROC = -4;
WM_PAINT = $000F;
type
WPARAM = Integer;
LPARAM = Integer;
LRESULT = Integer;
TFNWndProc = Integer;
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; external 'CallWindowProc{#A}@user32.dll stdcall';
var
OldStaticProcAddr: Longint;
function StaticWindowdProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
var
BuffPath: String;
begin
if Msg = WM_PAINT then
begin
BuffPath := WizardForm.FilenameLabel.Caption;
WizardForm.Caption := ExtractFilePath(BuffPath) + #32#32 + ExtractFileName(BuffPath);
end;
Result:= CallWindowProc(OldStaticProcAddr, hWnd, Msg, wParam, lParam);
end;
procedure InitializeWizard();
begin
WizardForm.FilenameLabel.Width := WizardForm.FilenameLabel.Width * 7;
WizardForm.Width := 1400;
OldStaticProcAddr := SetWindowLong(WizardForm.FilenameLabel.Handle, GWL_WNDPROC, CallbackAddr('StaticWindowdProc'));
end;
procedure DeinitializeSetup();
begin
SetWindowlong(WizardForm.FilenameLabel.Handle, GWL_WNDPROC, OldStaticProcAddr);
end;
Только вот инно по дефолту укорачивает длинный путь многоточием, чтоб уместить в длину статик текста. Решение - удлинить статик текст.
Для примера отображаю всё в заголовке формы
PS: как вариант копировать через код. Если решение выше не устраивает - говори. Будем делать через код
Максимальный путь в винде равен 260 (+1) символов
Доброе время суток, подскажите пожалуйста, сделал рекомпрессию прекомпом, в батнике написал Precomp041.exe - slow -c- "название файла", но распаковка потом не идёт, выдаёт ошибку запуска концольного приложения Precomp041, в чём проблема?
Johny777, благодарю. Да я обратился к этой теме скорее для повышения кругозора, чем из необходимости. Inno своими средствами выводит имена файлов, просто я обрезал строку FileNameLabel, чтобы отображалась только последняя папка и имя копируемого файла, и когда начинается копирование внешних файлов строка получается пустой.
-----------------------------------------------------------------
UPD
Твой способ, как раз то, что нужно. Лишь исправил немножко на:
BuffPath := WizardForm.FilenameLabel.Caption;
WizardForm.Caption := ExtractRelativePath(ExtractFileDir(BuffPath), BuffPath);
Спасибо :)
-----------------------------------------------------------------
Fakt_37, оффтоп
Внимание! Данная тема предназначена только для обсуждения написания скриптов ! »
Johny777
17-07-2013, 22:11
saurn,
только последняя папка »
пардон (не сделал в перд. коде), имя последней папки пути (путь без имени файла на конце) получаешь так:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application\Folder\saurn
[code ]
function GetLastPathFolderName(const UndefPath: String): String;
var
Len, i: Integer;
BuffStr: String;
begin
BuffStr := RemoveBackslash(UndefPath);
Len := Length(BuffStr);
for i := Len downto 1 do
begin
if BuffStr[i] = '\' then Break;
Result := Result + BuffStr[i];
end;
BuffStr := Result;
Result := '';
Len := Length(BuffStr);
for i := Len downto 1 do Result := Result + BuffStr[i];
end;
procedure InitializeWizard();
begin
MsgBox(GetLastPathFolderName(WizardForm.DirEdit.Text), mbInformation, MB_OK);
end;
или так MsgBox(ExtractFileName(ExtractFileName(WizardForm.DirEdit.Text)), mbInformation, MB_OK);
PS: функция GetLastPathFolderName написана на низком уровне, работает бетонно. В Си была бы длиннее, тк нужно было бы писать вручную RemoveBackslash() и Length()
Скорость работы GetLastPathFolderName на максимальном уровне. Всё остальное зависит от компилятора и я фиг знает как написана ExtractFileName. Поэтому к ExtractFileName нет доверия
Fakt_37, оффтоп
Цитата El Sanchez:
Внимание! Данная тема предназначена только для обсуждения написания скриптов ! » »
я знаю что ключ "-slow- -c-" нужно написать в скрипт, только не знаю куда, и мой вопрос относится к вашей теме!
R.i.m.s.k.y.
17-07-2013, 22:34
Необходимо простому пользователю поставить программу, требующую админские права.
Если запустить от админа - то все переменные пользователя инно определит админские, а не оригинального пользователя
Конкретно нужна папка appdata оригинального пользователя и его же HKCU
RunAsOriginalUser не решает
Как обойти грабли?
Johny777
17-07-2013, 22:56
R.i.m.s.k.y., поднятие привилегий собственному процессу не поможет? пример понятия привилегий в шапке, в "закрытии процесса".
возможные привилегии:
const
SE_CREATE_TOKEN_NAME = 'SeCreateTokenPrivilege';
SE_ASSIGNPRIMARYTOKEN_NAME = 'SeAssignPrimaryTokenPrivilege';
SE_LOCK_MEMORY_NAME = 'SeLockMemoryPrivilege';
SE_INCREASE_QUOTA_NAME = 'SeIncreaseQuotaPrivilege';
SE_UNSOLICITED_INPUT_NAME = 'SeUnsolicitedInputPrivilege';
SE_MACHINE_ACCOUNT_NAME = 'SeMachineAccountPrivilege';
SE_TCB_NAME = 'SeTcbPrivilege';
SE_SECURITY_NAME = 'SeSecurityPrivilege';
SE_TAKE_OWNERSHIP_NAME = 'SeTakeOwnershipPrivilege';
SE_LOAD_DRIVER_NAME = 'SeLoadDriverPrivilege';
SE_SYSTEM_PROFILE_NAME = 'SeSystemProfilePrivilege';
SE_SYSTEMTIME_NAME = 'SeSystemtimePrivilege';
SE_PROF_SINGLE_PROCESS_NAME = 'SeProfileSingleProcessPrivilege';
SE_INC_BASE_PRIORITY_NAME = 'SeIncreaseBasePriorityPrivilege';
SE_CREATE_PAGEFILE_NAME = 'SeCreatePagefilePrivilege';
SE_CREATE_PERMANENT_NAME = 'SeCreatePermanentPrivilege';
SE_BACKUP_NAME = 'SeBackupPrivilege';
SE_RESTORE_NAME = 'SeRestorePrivilege';
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
SE_DEBUG_NAME = 'SeDebugPrivilege';
SE_AUDIT_NAME = 'SeAuditPrivilege';
SE_SYSTEM_ENVIRONMENT_NAME = 'SeSystemEnvironmentPrivilege';
SE_CHANGE_NOTIFY_NAME = 'SeChangeNotifyPrivilege';
SE_REMOTE_SHUTDOWN_NAME = 'SeRemoteShutdownPrivilege';
SE_UNDOCK_NAME = 'SeUndockPrivilege';
SE_SYNC_AGENT_NAME = 'SeSyncAgentPrivilege';
SE_ENABLE_DELEGATION_NAME = 'SeEnableDelegationPrivilege';
SE_MANAGE_VOLUME_NAME = 'SeManageVolumePrivilege';
SE_IMPERSONATE_NAME = 'SeImpersonatePrivilege';
SE_CREATE_GLOBAL_NAME = 'SeCreateGlobalPrivilege';
описание каждой привилегии: http://msdn.microsoft.com/en-us/library/windows/desktop/bb530716%28v=vs.85%29.aspx
ай-ди своего процесса получаешь WinApi-функцией GetCurrentProcessId()
Получить иня пользователя запустившего экзешник можно http://www.delphimaster.net/view/4-1107175032 в 5-м сообщении например рабочий пример (протестировал на делфи)
R.i.m.s.k.y.
17-07-2013, 23:07
поднятие привилегий собственному процессу не поможет? »
может и поможет, но это применимо к самому установщику который уже запущен?
Получить иня пользователя запустившего экзешник можно »
как в таком случае достучаться до HCKU и appdata?
Johny777
17-07-2013, 23:22
может и поможет, но это применимо к самому установщику который уже запущен? »
да, то бишь когда есть процесс (твой конечно)
поднимай например перед тем как тебе нужно выполнить действия админа. Опускай после завершения действий
как в таком случае достучаться до HCKU и appdata? »
может после поднятия привилегий достучишься, но ведь HCKU - это ветка текущего пользователя. Разве проблема туда писать или читать оттуда из под текущего пользователя?
PS: Если честно я хз получится ли
=================================================================================================
Fakt_37, Так сойдёт?
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
[Files]
Source: Precomp041.exe; Flags: dontcopy nocompression;
[Run]
Description: Extracting precompiled File; Filename: {tmp}\Precomp041.exe; WorkingDir: {tmp}; Parameters: твои параметры распаковки; Check: ExtractProgramm('Precomp041.exe');
[code ]
function ExtractProgramm(const TempFileName: String): Boolean;
begin
ExtractTemporaryFile(TempFileName);
Result := FileExists(AddBackslash(ExpandConstant('{tmp}')) + TempFileName);
end;
R.i.m.s.k.y.
18-07-2013, 13:32
Цитата Johny777:
PS: Если честно я хз получится ли »
не, не получается
Установщик запрашивает логин/пасс админа и все делает для него
Зачем тогда в Инно флаг runAsoriginaluser? и как этот параметр работает?
Даже если запустить свой установщик из другого с runAsoriginaluser - борода, все вносится в админский акк
Приветствую еще раз! Можно ли в Inno Setup поменять порядок выполнения секций? Нужно сначала [Run] прогнать, а потом уже [Dirs] и [Files].
Fakt_37, Так сойдёт?
читать дальше » »
да спасибо должно помочь, и еще один вопрос, как сделать чтоб можно было выбрать русскую (озвучку. текст и тд)или английскую, причём если выбираешь русскую чтоб только она и устанавливалась, и на файл с английской инсталятор не обращал внимания?
R.i.m.s.k.y.
18-07-2013, 18:03
mifkys, нет
используй CurStepChanged/CurPageChanged
Всем доброго времени суток! Возникла необходимость средствами Inno узнать название видеоадаптера. Кто подскажет, как с помощью API в Inno это провернуть?
Fakt_37, читайте в справке про секцию [Components]
[Components]
Name: rus; Description: Русская озвучка; Types: full; Falgs: exclusive
Name: eng; Description: Английская озвучка; Types: custom; Falgs: exclusive
[Files]
Source: rus\*; DestDir: {app}; Components: rus; Flags: recursesubdirs overwritereadonly createallsubdirs ignoreversion;
Source: eng\*; DestDir: {app}; Components: eng; Flags: recursesubdirs overwritereadonly createallsubdirs ignoreversion;
флаг exclusive »
Точно, запамятовал)
R.i.m.s.k.y.
18-07-2013, 19:15
nik1967, в шапке скрипт Ultimate Test Black Skin, в нем выдергивается не только имя адаптера, но и память, разрешение экрана...
Fakt_37 saurn, флаг exclusive
[Components]
Name: rus; Description: Русская озвучка; Types: full; Falgs: exclusive
Name: eng; Description: Английская озвучка; Types: custom; Falgs: exclusive
[Files]
Source: rus\*; DestDir: {app}; Components: rus; Flags: recursesubdirs overwritereadonly createallsubdirs ignoreversion;
Source: eng\*; DestDir: {app}; Components: eng; Flags: recursesubdirs overwritereadonly createallsubdirs ignoreversion;
Johny777
18-07-2013, 20:43
nik1967, список имён видеокарт через winapi-функцию EnumDisplayDevices() :
#define A = (Defined UNICODE) ? "W" : "A"
const
DISPLAY_DEVICE_MODESPRUNED = $8000000;
type
_DISPLAY_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
StateFlags: DWORD;
end;
Pointer = Integer;
function EnumDisplayDevices(Unused: Pointer; iDevNum: DWORD; var lpDisplayDevice: _DISPLAY_DEVICE; dwFlags: DWORD): BOOL; external 'EnumDisplayDevices{#A}@user32.dll stdcall';
procedure Inc(var Int: Integer);
begin
Int := Int + 1;
end;
function CharArrayToString(aChar: array of Char): String;
begin
Result := '';
while aChar[Length(Result)] <> #0 do Insert(aChar[Length(Result)], Result, Length(Result)+1);
end;
function InArray(const uArray: array of String; const SearchStr: String): Boolean;
var
i, Len: Integer;
begin
Len := GetArrayLength(uArray);
if Len = 0 then Exit;
for i := 0 to Len-1 do
begin
Result := uArray[i] = SearchStr;
if Result then Break;
end;
end;
function GetVideoDevices(): array of String;
var
dd: _DISPLAY_DEVICE;
iDevNum: Integer;
Len: Integer;
Buff: String;
begin
dd.cb := SizeOf(dd);
while EnumDisplayDevices(0, iDevNum, dd, 0) do
begin
if dd.StateFlags = DISPLAY_DEVICE_MODESPRUNED then
begin
Buff := CharArrayToString(dd.DeviceString);
if not InArray(Result, Buff) then
begin
Len := GetArrayLength(Result);
SetArrayLength(Result, Len+1);
Result[Len] := Buff;
end;
end;
Inc(iDevNum);
end;
end;
procedure InitializeWizard();
var
sArray: array of String;
i: Integer;
begin
sArray := GetVideoDevices();
for i := 0 to GetArrayLength(sArray)-1 do MsgBox(sArray[i], mbInformation, MB_OK);
end;
PS: с флагами запутался. http://msdn.microsoft.com/en-us/library/windows/desktop/dd183569%28v=vs.85%29.aspx
Почему то имя одной и той же видеокарты возвращает 2 раза. Решаю этот вопрос проверкой на отсутствие имени в выходном массиве строк
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.