Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 4]
R.i.m.s.k.y.
14-12-2011, 15:44
Photon9, скрипт скрасил бы твой сумбур :)
пока примерно так
[Tasks]
Name: vcredist; Description: "Установить visual c++"; GroupDescription: Дополнительные компоненты
...
[Run]
Tasks: vcredist; Filename: "vcredist.exe"; Parametrs: " /Q /norestart"; Description: Установка visual c++; Flags: RinHidden
//параметры установки vcredist.exe уточни
Только end ещё один не хватало »
поправил сообщение еще раз, расставил енды, одного не хватало
R.i.m.s.k.y., у меня кажется всё ещё проблемма)
При пустом вводе без параметров не работает, когда я end сам добавил.
Сейчас перед end добавил Result := True; стало работать но боюсь что не корректно... пока проверяю..
Мне нужно чтобы работало как с параметрами /x1 /x2 так и без них,
причём могут быть дефолтные ключи, например /verysilent надеюсь это не должно конфликтовать?
Пока конкретная проблемма с пустым вводом получилась...
TROY Diamond
14-12-2011, 16:18
YURSHAT
Спасибо всё работает, НО нужно чтобы файл создавался в процессе установки, как из "[INI]" и/или был пустым, а потом вводил моё значение?
Тоже работает, спасибо!
Это "надёжный" способ? Пользователь никак НЕ сможет продолжить установку БЕЗ прочтения?!
А, что вот это закомментированное "//WizardForm.Caption:= IntToStr(CurrLine);", такое,
если его раскомментировать и скомпилировать, то название приложения изчезает и в заголовке и появляется "27"
Как в процессе установки запустить, а потом автоматически его закрыть, не имеет значение из секции Run или Code?
Можно ведь, наверное и через "taskkill.exe" как-то это сделать?
Есть ли возможность при запуске установщика и/или в процессе установки, собрать необходимые сведения о компе, а потом их добавить в ветку реестра устанавливаемого приложения?
Или может какой-нибудь параметр есть? Есть же ведь имя компа, имя пользователя и т.п. Это ведь определяется?
Мне ,к примеру нужно, в реестре в ветке приложения создать ключ для видеокарты: "3D Device" со значение "Название видеокарты" и т.п.
А кнопка "Отмена" и сам установщик, должен не реагировать во время выполнения команд из секции Code? Это никак не исправить?
И когда его "отпускает" если нажать на кнопку "Отмена", можно ли "откатить" всё, чтобы в папке установки ничего не осталось или это действует только на "стандарт"?
а ну всё! получилось, протестил варианты!
R.i.m.s.k.y.
14-12-2011, 16:20
semiono, /verysilent как видишь не учитывается и никак не влияет
какое второе условие на копирование в секции Files x1files? выбор из списка компонентов?
у тебя /х2 /х1 всегда идут вместе с /verysilent?
я ж не знал что у тебя еще условия, какие граничные условия обозначил - такие я тебе и сделал
естественно что можно в подчековую функцию напихать таким же макаром еще проверок для конкретизации
Можно ведь, наверное и через "taskkill.exe" как-то это сделать? »
я тоже сначала сделал через "taskkill.exe", но как оказалось не на всех редакциях венды он есть, хе-хе
TROY Diamond
почисть личку, ничего не отправляется
; ~
Lowercase('/x1') : x1 := true;
Lowercase('/x2') : x2 := true;
end;
Result := True;
end
Result := True;
end;
Nautilus [Version 5.2.3790]
2001-2005 GmbH, Semiono
//setup.exe
//setup.exe /x1
//setup.exe /x2
//setup.exe /x2 /x1
//setup.exe /x2 /x1 /verysilent
это как в КП: "давим окурок левой ногой, потом правой а потом обееми сразу" :laugh:
я тоже сначала сделал через "taskkill.exe", но как оказалось не на всех редакциях венды он есть, хе-хе »
taskkill не годиться, он просто напросто может не работать из-за твиков причём даже если файл taskkill.exe имеется
Вот мой файл который можно использовать так: killsys.exe calc.exe.
Код 32-битный, но он может закрывать 64-битные приложения.
Работает рекурсивно, то-есть закроет все процессы.
Исходник:
include '%fasm%/win32ax.inc'
section '.code' executable
start:
invoke GetCommandLine
invoke CommandLineToArgv,eax,a
cmp dword [a],1
push eax
jbe exit
push dword [eax+4]
call AdjustMyToken
stdcall findProcessID
test eax,eax
jz exit
invoke OpenProcess,PROCESS_TERMINATE,FALSE,eax
push eax
invoke TerminateProcess,eax,1
invoke CloseHandle,[b]
jmp start
exit:
invoke ExitProcess,NULL
SE_PRIVILEGE_ENABLED = 2
TOKEN_ADJUST_PRIVILEGES = 32
TOKEN_QUERY = 8
TH32CS_SNAPPROCESS = 2
AdjustMyToken:
invoke LookupPrivilegeValue,NULL,NULL,tokenPriv.LUID1
mov dword [tokenPriv.PrivilegeCount],1
mov dword [tokenPriv.Attributes],SE_PRIVILEGE_ENABLED
invoke OpenProcessToken,-1,TOKEN_ADJUST_PRIVILEGES OR TOKEN_QUERY,b
invoke AdjustTokenPrivileges,[b],FALSE,tokenPriv,NULL,NULL,NULL
invoke CloseHandle,[b]
ret
findProcessID:
push ebp
invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,NULL
mov ebp,eax
mov dword [procEntry.dwSize],sizeof.PROCESSENTRY32W
invoke Process32First,eax,procEntry
@@:
invoke Process32Next,ebp,procEntry
test eax,eax
jz @f
invoke lstrcmpi,procEntry.szExeFile,dword [esp+8]
test eax,eax
jnz @r
mov eax,dword [procEntry.th32ProcessID]
@@:
pop ebp
ret
section '.data' readable writeable
a rd MAX_PATH
b rd MAX_PATH
struct TOKEN_PRIVILEGES
PrivilegeCount dd NULL
LUID1 dd NULL
LUID2 dd NULL
Attributes dd NULL
ends
tokenPriv TOKEN_PRIVILEGES
struct PROCESSENTRY32W
dwSize dd NULL
cntUsage dd NULL
th32ProcessID dd NULL
th32DefaultHeapID dd NULL
th32ModuleID dd NULL
cntThreads dd NULL
th32ParentProcessID dd NULL
pcPriClassBase dd NULL
dwFlags dd NULL
szExeFile dw MAX_PATH dup NULL
ends
procEntry PROCESSENTRY32W
section '.idata' import readable
library advapi32,'ADVAPI32.DLL',kernel32,'KERNEL32.DLL',shell32,'SHELL32.DLL'
include '%fasm%/api/advapi32.inc'
import kernel32,CloseHandle,'CloseHandle',CreateToolhelp32Snapshot,'CreateToolhelp32Snapshot',\
ExitProcess,'ExitProcess',GetCommandLine,'GetCommandLineW',lstrcmpi,'lstrcmpiW',\
OpenProcess,'OpenProcess',Process32First,'Process32FirstW',Process32Next,'Process32NextW',\
TerminateProcess,'TerminateProcess'
import shell32,CommandLineToArgv,'CommandLineToArgvW'
R.i.m.s.k.y.
14-12-2011, 16:39
taskkill не годиться, он просто напросто может не работать из-за твиков »
если тасккилл не работает из-за твиков, то винда уже не твикнутая, а убитая
а это уже к ветеринару, а не к нам
Вот скрипт, не уверен что я правильно вставил данные, жду совета
sergey3695
14-12-2011, 17:42
semiono,
как использовать killsys.exe
Exec(ExpandConstant('{tmp}\killsys.exe'), 'setup.tmp', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
так не работает. как надо?
R.i.m.s.k.y.
14-12-2011, 17:43
Photon9, инно не кусается, запусти и сам все увидишь
По ходу прощёлкал момент с кодировкой и русские надписи знаками вопроса отмечены, но это чепуха исправить не сложно, главное чтобы скрипт работал
R.i.m.s.k.y., если ты обращался ко мне то проверить можно конечно, но размер дистрибутива 9 гигов, неохота по нескольку раз компилить
R.i.m.s.k.y.
14-12-2011, 17:49
Photon9, делай в секции Files пустышки, легкие файлы чтобы только отследить копирование
по факту в Tasks GroupDescription - это описание группы, писать надо по русски, а ты по английски чего-то нагромозекал
[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
Name: vcredist2005; Description: "MS Visual c++ 2005 SP1"; GroupDescription: "MS Visual c++ "
Name: vcredist2008; Description: "MS Visual c++ 2008"; GroupDescription: "MS Visual c++ "
Name: vcredistDirectX; Description: "Установить DirectX"; GroupDescription: "Прочее"
Name: Net Framework 4.0; Description: "Установить Net Framework 4.0"; GroupDescription: "Прочее"
и что за фак - имена задач одинаковые, для каждой задачи - свое имя, это же имя используешь в Run
Боюсь показатся тупым, но как под соответствующие пункты подставится требуемый софт если в разделе [Tasks] путь к дистрибутивам не указан?
sergey3695, нужно указать в качестве параметра имя процесса который надо закрыть, например, notepad.exe.
тебе нужен ShellExec(), а не WinExec(), чтобы указать параметры.
как-то так..
ShellExec('', ExpandConstant('{tmp}\killsys.exe', 'notepad.exe', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode)
Попробуй без InnoSetup запустить killsys notepad.exe и увидешь как это работает.
No4noylis
14-12-2011, 22:09
Photon9, Если я тебя правильно понял, то через секцию [Run] устанавливай свой софт только дописывай
Tasks: "имя софта в секции таск";
С секцией tack я вроде разобрался, но вот на секции run скрипт стопорится :( матерится на Parametrs: " /Q /norestart"
И ещё вопросец как в ярлыке прописать рабочую папку, делал так но почему то не прописывается:
[Icons]
Name: {group}\FalloutNV; Filename: {app}\FalloutNVLauncher.exe; WorkingDir: {app}
valyok666
15-12-2011, 13:03
Photon9,
В твоём скрипте
[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
Name: vcredist_x86; Description: "Óñòàíîâèòü MS Visual c++ 2005 SP1"; GroupDescription: "Äîïîëíèòåëüíûé ñîôò"
Name: vcredist_x86; Description: "Óñòàíîâèòü MS Visual c++ 2008"; GroupDescription: "Äîïîëíèòåëüíûé ñîôò"
Name: dotNetFx40_Full_x86_x64; Description: "Óñòàíîâèòü Net Framework 4.0"; GroupDescription: "Äîïîëíèòåëüíûé ñîôò"
Name: DXSETUP; Description: "Óñòàíîâèòü DirectX"; GroupDescription: "Äîïîëíèòåëüíûé ñîôò"
[Run]
Filename: {app}\FalloutNVLauncher.exe; Description: {cm:LaunchProgram,Fallout New Vegas}; Flags: nowait postinstall skipifsilent
Tasks: vcredist_x86; Filename: "Redists\vcredist_x86.exe"; Parametrs: /Q /norestart; Description: Óñòàíîâêà MS Visual c++; Flags: RinHidden
Tasks: vcredist_x86; Filename: "Redists\vc2008\vcredist_x86.exe"; Parametrs: " /Q /norestart"; Description: Óñòàíîâêà MS Visual c++; Flags: RinHidden
Tasks: dotNetFx40_Full_x86_x64; Filename: "Redists\dotNetFx40_Full_x86_x64.exe"; Parametrs: " /Q /norestart"; Description: Óñòàíîâêà Net Framework 4.0; Flags: RinHidden
Tasks: DXSETUP; Filename: "Redists\directx\DXSETUP.exe"; Parametrs: " /Q /norestart"; Description: Óñòàíîâêà DirectX; Flags: RinHidden
А надо-->
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Name: Redist; Description: Дополнительное Пограммное Обеспечение:;
Name: Redist\directx; Description: Обновить Microsoft DirectX; Flags: unchecked;
Name: Redist\vcredist_x86_2005SP1; Description: "Установить MS Visual c++ 2005 SP1"; Flags: unchecked;
Name: Redist\vcredist_x86_2008; Description: "Установить MS Visual c++ 2008"; Flags: unchecked;
Name: Redist\dotNetFx40_Full_x86_x64; Description: "Установить Net Framework 4.0"; Flags: unchecked;
[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, "&", "&&")}}"; Flags: nowait postinstall skipifsilent
Filename: {src}\Redist\directx.exe; WorkingDir: {src}\Redist\; Parameters: /silent; Tasks: Redist\directx; Flags: waituntilterminated;
Filename: {src}\Redist\vcredist_x86_2005SP1.exe; WorkingDir: {src}\Redist\; Parameters: /silent; Tasks: Redist\vcredist_x86_2005SP1; Flags: waituntilterminated;
Filename: {src}\Redist\vcredist_x86_2008.exe; WorkingDir: {src}\Redist\; Parameters: /silent; Tasks: Redist\vcredist_x86_2008; Flags: waituntilterminated;
Filename: {src}\Redist\netframework.exe; WorkingDir: {src}\Redist\; Parameters: /silent; Tasks: Redist\dotNetFx40_Full_x86_x64; Flags: waituntilterminated;
TROY Diamond
15-12-2011, 19:02
1. Почему не работает этот код для удаления сохранений?
[_Code_]
procedure DeleteSavedGames(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep=usUninstall then
if DirExists(ExpandConstant('{app}')+'\Profiles') then
if MsgBox(ExpandConstant('{cm:DeleteSave}'), mbInformation, MB_YESNO) = idYes then
DelTree(ExpandConstant('{app}')+'\Profiles', True, True, True)
end;
2. Есть ли способ "обновить" дополнить список файлов для деинсталляции?
В процессе установки создаются файлы, о которых установщик "не знает", можно ли их как-то их "вписать"?
Или же просто использовать секцию [UninstallDelete]?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.