» Inno Setup (создание инсталяционных пакетов)
Всех с Новым 2009 годом!
Мне нужен скрипт: вверх как в NSIS. Помогите найти...
И еще как установить службу виндовс, пробывал с реестром но не получилось.
И еще как установить службу виндовс, пробывал с реестром но не получилось.
SotM
http://forum.ru-board.com/topic.cgi?forum=5&topic=29117&start=21&limit=1&m=1#1
А можно в этом коде ввода ключа сделать прозрачными ячейки. А вставил картинку на задний план и надо сделать прозрачными ячейки. Сможешь помочь? Или может быть, кто еще сможет?
http://forum.ru-board.com/topic.cgi?forum=5&topic=29117&start=21&limit=1&m=1#1
А можно в этом коде ввода ключа сделать прозрачными ячейки. А вставил картинку на задний план и надо сделать прозрачными ячейки. Сможешь помочь? Или может быть, кто еще сможет?
Народ всех с Новым годом. Скажите пожалуйста как в шттщ ыуегз можно принцдительно программно прекратить установку и откатить предыдущие действия? То есть идет проверка если офис установлен то все хорошо иначе все пракратить. Заранее спасибо
Всех inno-гуру и inno-чайников с Новым годом!
Подскажите, кто знает, как все-таки срастить inno и precomp. Уточняю вопрос: распаковывается пережатый precomp файл, тут же запускается precomp, происходит рекомпрессия файла, первоначальный прекомповский файл за ненадобностью удаляется, inno распаковывает следующий файл - алгоритм повторяется. Как все это физически воплотить? Уверен, что это возможно, но кодинга, увы не знаю, с Inno знаком достаточно поверхностно, буду очень благодарен за ответ (и не я один!)
P.S. Может замудрил с вопросом, спрошу проще - как во время инсталляции останавливать inno (во время копирования файлов на винт), запускать некую программу и после снова продолжать работу inno?
Подскажите, кто знает, как все-таки срастить inno и precomp. Уточняю вопрос: распаковывается пережатый precomp файл, тут же запускается precomp, происходит рекомпрессия файла, первоначальный прекомповский файл за ненадобностью удаляется, inno распаковывает следующий файл - алгоритм повторяется. Как все это физически воплотить? Уверен, что это возможно, но кодинга, увы не знаю, с Inno знаком достаточно поверхностно, буду очень благодарен за ответ (и не я один!)
P.S. Может замудрил с вопросом, спрошу проще - как во время инсталляции останавливать inno (во время копирования файлов на винт), запускать некую программу и после снова продолжать работу inno?
sanmon
Можно организовать. Только для примера приведенного ниже необходимо названия "прекомпрессированных" файлов привести к виду "имя_файла.расширение.pcf"
[more]
[no]
[Files]
Source: "precomp\*"; DestDir: "{tmp}"; Flags: ignoreversion overwritereadonly
Source: "Data\*"; DestDir: "{app}"; Flags: overwritereadonly recursesubdirs ignoreversion createallsubdirs sortfilesbyextension; AfterInstall: RecompressPCF
[Code]
procedure RecompressPCF;
var
Tmp, Text,
InputFile, OutputFile: string;
n, ResultCode: Integer;
begin
if ExtractFileExt(CurrentFileName)='.pcf' then
begin
InputFile:=ExpandConstant(CurrentFileName);
n:=Length(InputFile);
while InputFile[n]<>'.' do
n:=n-1;
OutputFile:=Copy(InputFile, 1, n-1);
Text:=WizardForm.StatusLabel.Caption;
WizardForm.StatusLabel.Caption:='Рекомпрессия извлеченного файла...';
WizardForm.FileNameLabel.Caption:=OutputFile;
Tmp:=ExpandConstant('{tmp}\');
Exec(Tmp+'precomp.exe', '-d -o"'+OutputFile+'" "'+InputFile+'"', Tmp, SW_HIDE, ewWaitUntilTerminated, ResultCode);
DeleteFile(InputFile);
WizardForm.StatusLabel.Caption:=Text;
end;
end;[/more]
Можно организовать. Только для примера приведенного ниже необходимо названия "прекомпрессированных" файлов привести к виду "имя_файла.расширение.pcf"
[more]
[no]
[Files]
Source: "precomp\*"; DestDir: "{tmp}"; Flags: ignoreversion overwritereadonly
Source: "Data\*"; DestDir: "{app}"; Flags: overwritereadonly recursesubdirs ignoreversion createallsubdirs sortfilesbyextension; AfterInstall: RecompressPCF
[Code]
procedure RecompressPCF;
var
Tmp, Text,
InputFile, OutputFile: string;
n, ResultCode: Integer;
begin
if ExtractFileExt(CurrentFileName)='.pcf' then
begin
InputFile:=ExpandConstant(CurrentFileName);
n:=Length(InputFile);
while InputFile[n]<>'.' do
n:=n-1;
OutputFile:=Copy(InputFile, 1, n-1);
Text:=WizardForm.StatusLabel.Caption;
WizardForm.StatusLabel.Caption:='Рекомпрессия извлеченного файла...';
WizardForm.FileNameLabel.Caption:=OutputFile;
Tmp:=ExpandConstant('{tmp}\');
Exec(Tmp+'precomp.exe', '-d -o"'+OutputFile+'" "'+InputFile+'"', Tmp, SW_HIDE, ewWaitUntilTerminated, ResultCode);
DeleteFile(InputFile);
WizardForm.StatusLabel.Caption:=Text;
end;
end;[/more]
valeron87, СПАСИБО БОЛЬШОЕ-ПРЕБОЛЬШОЕ! Буду равзбираться! А откуда знания почерпнуть по кодингу в Inno, если не секрет?
Ребята, в последнее время стала очень актуальна тема создания портабельных версий приложений. Задача такова: создать на Inno Setup инсталлятор для запуска портабельных приложений. Казалось бы, задача тривиальная, но как быть если программа регистрируется в системном реестре? Ведь после закрытия программы желательно автоматически удалить с HDD не только ее файлы, но и данные о регистрации. В идеале "инсталлятор" портабельных программ должен удовлетворять следующим условиям: 1) запускаться в "тихом" режиме, копируя файлы программы во временный каталог; 2) после копирования файлов вносить данные о регистрации в системный реестр; 3) не закрываясь (находясь в процессах) запускать исполнительный файл портабельной программы; 4) дожидаться окончания работы исполнительного файла портабельной программы, и автоматически удалять все ее файлы с HDD и данные регистрации из системного реестра. Пункты 1 и 2 нареканий не вызывают, а вот как реализовать алгоритм описанный в пунктах 3 и 4 (средствами Inno Setup) я честно не знаю! Если у Вас есть время и желание, пожалуйста, помогите разобраться в этом вопросе.
Artem_Butenko
приветствую
ей богу - нет необходимости дважды выдумывать велосипед
так как портабл проги обычно хрянят в себе все необходимое для запуска
на то они и портабл-версии... т.е. при создании портабл версии делается
два снэпшота системы "до" установки и "после" разница собирается в чемодан-ехе портабл-версии и при запуске системе "подсовывается все необходимое"
проверено так что не нужно велик думать када есть мопед
другое дело если инсталлер сделать для портабл - так тут все более чем тривиально
ярлыки прописать на десктоп да папку назначения указать
надеюсь пояснил доходчиво... с уважением :о)
приветствую
ей богу - нет необходимости дважды выдумывать велосипед
так как портабл проги обычно хрянят в себе все необходимое для запуска
на то они и портабл-версии... т.е. при создании портабл версии делается
два снэпшота системы "до" установки и "после" разница собирается в чемодан-ехе портабл-версии и при запуске системе "подсовывается все необходимое"
проверено так что не нужно велик думать када есть мопед
другое дело если инсталлер сделать для портабл - так тут все более чем тривиально
ярлыки прописать на десктоп да папку назначения указать
надеюсь пояснил доходчиво... с уважением :о)
paul_smART -- смысл в выше описанных действиях есть. Такое обычно реализуют в NSIS, а вот за Inno Setup, как-то обидно. Еще раз очень прошу, пожалуйста, помогите реализовать пункты 3 и 4. Если Вы знаете, как реализовать подобное, буду очень признателен за Вашу помощь!
А как изменить цвет заголовка активного окна инсталятора. В поиске не удалось найти, может в документации где об этом написано? В любом случае буду благодарен за ответ в посте.
Мне нужен скрипт: вверх как в NSIS. Помогите найти...
И еще как установить службу виндовс, пробывал с реестром но не получилось.
И еще как установить службу виндовс, пробывал с реестром но не получилось.
Помогите сделать такую простую весч:
- Путь указывался исходя из ветки реестра.
К примеру, есть HKLM\Software\Myapp, а в ней string Path, содержащий путь D:\App.
Следовательно, при запуске инсталятора директория по умолчанию ставилась D:\App...
И еще, как сделать, чтоб, допустим, если нет того ключа реестра высвечивало Программа не установлена... и инсталятор вырубался.
P.S. : вышеописанное я встречал пару раз в патчах к играм (допустим Stalker), но при декомпиляции в скриптах ничего не обнаружил...
- Путь указывался исходя из ветки реестра.
К примеру, есть HKLM\Software\Myapp, а в ней string Path, содержащий путь D:\App.
Следовательно, при запуске инсталятора директория по умолчанию ставилась D:\App...
И еще, как сделать, чтоб, допустим, если нет того ключа реестра высвечивало Программа не установлена... и инсталятор вырубался.
P.S. : вышеописанное я встречал пару раз в патчах к играм (допустим Stalker), но при декомпиляции в скриптах ничего не обнаружил...
Вот! Если в реестре нет то берется
DefaultDirName={reg:HKLM\Software\Myapp,Path|{pf}\default_dir_name}
DefaultDirName={reg:HKLM\Software\Myapp,Path|{pf}\default_dir_name}
Уважаемые ценители Inno Setup, я все с той же сумашедшей идеей создания оболочки для временной установки портабельных программ. Появились новые идеи. Постараюсь описать их подробнее: а) инсталлятор работая в абсолютно "тихом" режиме, копирует файлы программы во временный каталог; б) после того, как все файлы пакета будут распакованы, инсталлятор (не закрываясь) последовательно запускает файлы Install.reg, затем Startup.exe, и дожидается пока пользователь сам закроет запущенный файл Startup.exe (главный исполнительный файл портабельной программы); в) после этого, инсталлятор должен запустить файл Uninstall.reg и удалить все файлы портабельной программы из временного каталога. Как я понимаю способ временной регистрации программы через секцию [Registry] невозможен. Единственный вариант - это запуск файлов Install.reg и Uninstall.reg. Другой вопрос в том, как "защитить" тихий инсталл от комбинации Alt+Tab, чтобы при случайном нажатии окно "тихого" инсталла не отображалось на панели задач?
Цитата:
как сделать, чтоб, допустим, если нет того ключа реестра высвечивало Программа не установлена... и инсталятор вырубался
Код: [code]
function InitializeSetup(): Boolean;
begin
if not RegValueExists(HKLM, 'SOFTWARE\имя_ветки', 'имя_параметра')
then
begin
MsgBox('Путь установки не обнаружен. Установка невозможна.', mbError, mb_Ok);
Exit;
end;
end;
JuNoS
Цитата:
Вот архив NSIS_ImageHeader в комплекте с неплохой картинкой.
При установленном NSIS другие файлы можно взять здесь - С:\Program Files\NSIS\Contrib\Graphics\Header
Цитата:
Скрипт из [more=IS Extensions Knowledge Base.]
[Setup]
AppName=ServiceTools
AppVerName=ServiceTools
CreateAppDir=false
[_ISTool]
EnableISX=true
[Code]
type
SERVICE_STATUS = record
dwServiceType : cardinal;
dwCurrentState : cardinal;
dwControlsAccepted : cardinal;
dwWin32ExitCode : cardinal;
dwServiceSpecificExitCode : cardinal;
dwCheckPoint : cardinal;
dwWaitHint : cardinal;
end;
HANDLE = cardinal;
const
SERVICE_QUERY_CONFIG = $1;
SERVICE_CHANGE_CONFIG = $2;
SERVICE_QUERY_STATUS = $4;
SERVICE_START = $10;
SERVICE_STOP = $20;
SERVICE_ALL_ACCESS = $f01ff;
SC_MANAGER_ALL_ACCESS = $f003f;
SERVICE_WIN32_OWN_PROCESS = $10;
SERVICE_WIN32_SHARE_PROCESS = $20;
SERVICE_WIN32 = $30;
SERVICE_INTERACTIVE_PROCESS = $100;
SERVICE_BOOT_START = $0;
SERVICE_SYSTEM_START = $1;
SERVICE_AUTO_START = $2;
SERVICE_DEMAND_START = $3;
SERVICE_DISABLED = $4;
SERVICE_DELETE = $10000;
SERVICE_CONTROL_STOP = $1;
SERVICE_CONTROL_PAUSE = $2;
SERVICE_CONTROL_CONTINUE = $3;
SERVICE_CONTROL_INTERROGATE = $4;
SERVICE_STOPPED = $1;
SERVICE_START_PENDING = $2;
SERVICE_STOP_PENDING = $3;
SERVICE_RUNNING = $4;
SERVICE_CONTINUE_PENDING = $5;
SERVICE_PAUSE_PENDING = $6;
SERVICE_PAUSED = $7;
// #######################################################################################
// nt based service utilities
// #######################################################################################
function OpenSCManager(lpMachineName, lpDatabaseName: string; dwDesiredAccess :cardinal): HANDLE; external 'OpenSCManagerA@advapi32.dll stdcall';
function OpenService(hSCManager :HANDLE;lpServiceName: string; dwDesiredAccess :cardinal): HANDLE; external 'OpenServiceA@advapi32.dll stdcall';
function CloseServiceHandle(hSCObject :HANDLE): boolean; external 'CloseServiceHandle@advapi32.dll stdcall';
function CreateService(hSCManager :HANDLE;lpServiceName, lpDisplayName: string;dwDesiredAccess,dwServiceType,dwStartType,dwErrorControl: cardinal;lpBinaryPathName,lpLoadOrderGroup: String; lpdwTagId : cardinal;lpDependencies,lpServiceStartName,lpPassword :string): cardinal; external 'CreateServiceA@advapi32.dll stdcall';
function DeleteService(hService :HANDLE): boolean; external 'DeleteService@advapi32.dll stdcall';
function StartNTService(hService :HANDLE;dwNumServiceArgs : cardinal;lpServiceArgVectors : cardinal) : boolean; external 'StartServiceA@advapi32.dll stdcall';
function ControlService(hService :HANDLE; dwControl :cardinal;var ServiceStatus :SERVICE_STATUS) : boolean; external 'ControlService@advapi32.dll stdcall';
function QueryServiceStatus(hService :HANDLE;var ServiceStatus :SERVICE_STATUS) : boolean; external 'QueryServiceStatus@advapi32.dll stdcall';
function QueryServiceStatusEx(hService :HANDLE;ServiceStatus :SERVICE_STATUS) : boolean; external 'QueryServiceStatus@advapi32.dll stdcall';
function OpenServiceManager() : HANDLE;
begin
if UsingWinNT() = true then begin
Result := OpenSCManager('','ServicesActive',SC_MANAGER_ALL_ACCESS);
if Result = 0 then
MsgBox('the servicemanager is not available', mbError, MB_OK)
end
else begin
MsgBox('only nt based systems support services', mbError, MB_OK)
Result := 0;
end
end;
function IsServiceInstalled(ServiceName: string) : boolean;
var
hSCM : HANDLE;
hService: HANDLE;
begin
hSCM := OpenServiceManager();
Result := false;
if hSCM <> 0 then begin
hService := OpenService(hSCM,ServiceName,SERVICE_QUERY_CONFIG);
if hService <> 0 then begin
Result := true;
CloseServiceHandle(hService)
end;
CloseServiceHandle(hSCM)
end
end;
function InstallService(FileName, ServiceName, DisplayName, Description : string;ServiceType,StartType :cardinal) : boolean;
var
hSCM : HANDLE;
hService: HANDLE;
begin
hSCM := OpenServiceManager();
Result := false;
if hSCM <> 0 then begin
hService := CreateService(hSCM,ServiceName,DisplayName,SERVICE_ALL_ACCESS,ServiceType,StartType,0,FileName,'',0,'','','');
if hService <> 0 then begin
Result := true;
// Win2K & WinXP supports aditional description text for services
if Description<> '' then
RegWriteStringValue(HKLM,'System\CurrentControlSet\Services' + ServiceName,'Description',Description);
CloseServiceHandle(hService)
end;
CloseServiceHandle(hSCM)
end
end;
function RemoveService(ServiceName: string) : boolean;
var
hSCM : HANDLE;
hService: HANDLE;
begin
hSCM := OpenServiceManager();
Result := false;
if hSCM <> 0 then begin
hService := OpenService(hSCM,ServiceName,SERVICE_DELETE);
if hService <> 0 then begin
Result := DeleteService(hService);
CloseServiceHandle(hService)
end;
CloseServiceHandle(hSCM)
end
end;
function StartService(ServiceName: string) : boolean;
var
hSCM : HANDLE;
hService: HANDLE;
begin
hSCM := OpenServiceManager();
Result := false;
if hSCM <> 0 then begin
hService := OpenService(hSCM,ServiceName,SERVICE_START);
if hService <> 0 then begin
Result := StartNTService(hService,0,0);
CloseServiceHandle(hService)
end;
CloseServiceHandle(hSCM)
end;
end;
function StopService(ServiceName: string) : boolean;
var
hSCM : HANDLE;
hService: HANDLE;
Status : SERVICE_STATUS;
begin
hSCM := OpenServiceManager();
Result := false;
if hSCM <> 0 then begin
hService := OpenService(hSCM,ServiceName,SERVICE_STOP);
if hService <> 0 then begin
Result := ControlService(hService,SERVICE_CONTROL_STOP,Status);
CloseServiceHandle(hService)
end;
CloseServiceHandle(hSCM)
end;
end;
function IsServiceRunning(ServiceName: string) : boolean;
var
hSCM : HANDLE;
hService: HANDLE;
Status : SERVICE_STATUS;
begin
hSCM := OpenServiceManager();
Result := false;
if hSCM <> 0 then begin
hService := OpenService(hSCM,ServiceName,SERVICE_QUERY_STATUS);
if hService <> 0 then begin
if QueryServiceStatus(hService,Status) then begin
Result :=(Status.dwCurrentState = SERVICE_RUNNING)
end;
CloseServiceHandle(hService)
end;
CloseServiceHandle(hSCM)
end
end;
// #######################################################################################
// create an entry in the services file
// #######################################################################################
function SetupService(service, port, comment: string) : boolean;
var
filename : string;
s : string;
lines : TArrayOfString;
n : longint;
i : longint;
errcode : integer;
servnamlen : integer;
error : boolean;
begin
if UsingWinNT() = true then
filename := ExpandConstant('{sys}\drivers\etc\services')
else
filename := ExpandConstant('{win}\services');
if LoadStringsFromFile(filename,lines) = true then begin
Result := true;
n := GetArrayLength(lines) - 1;
servnamlen := Length(service);
error := false;
for i:=0 to n do begin
if Copy(lines[i],1,1) <> '#' then begin
s := Copy(lines[i],1,servnamlen);
if CompareText(s,service) = 0 then
exit; // found service-entry
if Pos(port,lines[i]) > 0 then begin
error := true;
lines[i] := '#' + lines[i] + ' # disabled because collision with ' + service + ' service';
end;
end
else if CompareText(Copy(lines[i],2,servnamlen),service) = 0 then begin
// service-entry was disabled
Delete(lines[i],1,1);
Result := SaveStringsToFile(filename,lines,false);
exit;
end;
end;
if error = true then begin
// save disabled entries
if SaveStringsToFile(filename,lines,false) = false then begin
Result := false;
exit;
end;
end;
// create new service entry
s := service + ' ' + port + ' # ' + comment + #13#10;
if SaveStringToFile(filename,s,true) = false then begin
Result := false;
exit;
end;
if error = true then begin
MsgBox('the ' + service + ' port was already used. The old service is disabled now. You should check the services file manually now.',mbInformation,MB_OK);
Exec('notepad.exe',filename,GetCurrentDir(),SW_SHOWNORMAL,ewNoWait,errcode);
end;
end
else
Result := false;
end;
// #######################################################################################
// version functions
// #######################################################################################
function CheckVersion(Filename : string;hh,hl,lh,ll : integer) : boolean;
var
VersionMS : cardinal;
VersionLS : cardinal;
CheckMS : cardinal;
CheckLS : cardinal;
begin
if GetVersionNumbers(Filename,VersionMS,VersionLS) = false then
Result := false
else begin
CheckMS := (hh shl $10) or hl;
CheckLS := (lh shl $10) or ll;
Result := (VersionMS > CheckMS) or ((VersionMS = CheckMS) and (VersionLS >= CheckLS));
end;
end;
// Some examples for version checking
function NeedShellFolderUpdate() : boolean;
begin
Result := CheckVersion('ShFolder.dll',5,50,4027,300) = false;
end;
function NeedVCRedistUpdate() : boolean;
begin
Result := (CheckVersion('mfc42.dll',6,0,8665,0) = false)
or (CheckVersion('msvcrt.dll',6,0,8797,0) = false)
or (CheckVersion('comctl32.dll',5,80,2614,3600) = false);
end;
function NeedHTMLHelpUpdate() : boolean;
begin
Result := CheckVersion('hh.exe',4,72,0,0) = false;
end;
function NeedWinsockUpdate() : boolean;
begin
Result := (UsingWinNT() = false) and (CheckVersion('mswsock.dll',4,10,0,1656) = false);
end;
function NeedDCOMUpdate() : boolean;
begin
Result := (UsingWinNT() = false) and (CheckVersion('oleaut32.dll',2,30,0,0) = false);
end;
// function IsServiceInstalled(ServiceName: string) : boolean;
// function IsServiceRunning(ServiceName: string) : boolean;
// function InstallService(FileName, ServiceName, DisplayName, Description : string;ServiceType,StartType :cardinal) : boolean;
// function RemoveService(ServiceName: string) : boolean;
// function StartService(ServiceName: string) : boolean;
// function StopService(ServiceName: string) : boolean;
// function SetupService(service, port, comment: string) : boolean;
// function CheckVersion(Filename : string;hh,hl,lh,ll : integer) : boolean;
function InitializeSetup(): boolean;
begin
if IsServiceInstalled('myservice') = false then begin
if InstallService('c:\winnt\system32\myservice.exe','myservice','my service','my service is doing usefull things',SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START) = true then begin
StartService('myservice');
StopService('myservice');
// after stopping a service you should wait some seconds before removing
RemoveService('myservice');
// otherwise removing can fail
end
end
else if IsServiceRunning('myservice') then
MsgBox('myservice is running',mbInformation, MB_OK);
Result := false
end;[/more] Возможности: создание, удаление, проверка, запуск и остановка служб.
Artem_Butenko
Цитата:
Я допускаю, что приложив немалые усилия, в урезанном паскале Inno можно сделать очень многое, но всё же тебе стоит переключиться на программы, специально предназначенные для создания портабельных приложений. Например, VMware ThinApp.
Цитата:
Мне нужен скрипт: вверх как в NSIS.
Вот архив NSIS_ImageHeader в комплекте с неплохой картинкой.
При установленном NSIS другие файлы можно взять здесь - С:\Program Files\NSIS\Contrib\Graphics\Header
Цитата:
как установить службу виндовс, пробывал с реестром но не получилось.
Скрипт из [more=IS Extensions Knowledge Base.]
[Setup]
AppName=ServiceTools
AppVerName=ServiceTools
CreateAppDir=false
[_ISTool]
EnableISX=true
[Code]
type
SERVICE_STATUS = record
dwServiceType : cardinal;
dwCurrentState : cardinal;
dwControlsAccepted : cardinal;
dwWin32ExitCode : cardinal;
dwServiceSpecificExitCode : cardinal;
dwCheckPoint : cardinal;
dwWaitHint : cardinal;
end;
HANDLE = cardinal;
const
SERVICE_QUERY_CONFIG = $1;
SERVICE_CHANGE_CONFIG = $2;
SERVICE_QUERY_STATUS = $4;
SERVICE_START = $10;
SERVICE_STOP = $20;
SERVICE_ALL_ACCESS = $f01ff;
SC_MANAGER_ALL_ACCESS = $f003f;
SERVICE_WIN32_OWN_PROCESS = $10;
SERVICE_WIN32_SHARE_PROCESS = $20;
SERVICE_WIN32 = $30;
SERVICE_INTERACTIVE_PROCESS = $100;
SERVICE_BOOT_START = $0;
SERVICE_SYSTEM_START = $1;
SERVICE_AUTO_START = $2;
SERVICE_DEMAND_START = $3;
SERVICE_DISABLED = $4;
SERVICE_DELETE = $10000;
SERVICE_CONTROL_STOP = $1;
SERVICE_CONTROL_PAUSE = $2;
SERVICE_CONTROL_CONTINUE = $3;
SERVICE_CONTROL_INTERROGATE = $4;
SERVICE_STOPPED = $1;
SERVICE_START_PENDING = $2;
SERVICE_STOP_PENDING = $3;
SERVICE_RUNNING = $4;
SERVICE_CONTINUE_PENDING = $5;
SERVICE_PAUSE_PENDING = $6;
SERVICE_PAUSED = $7;
// #######################################################################################
// nt based service utilities
// #######################################################################################
function OpenSCManager(lpMachineName, lpDatabaseName: string; dwDesiredAccess :cardinal): HANDLE; external 'OpenSCManagerA@advapi32.dll stdcall';
function OpenService(hSCManager :HANDLE;lpServiceName: string; dwDesiredAccess :cardinal): HANDLE; external 'OpenServiceA@advapi32.dll stdcall';
function CloseServiceHandle(hSCObject :HANDLE): boolean; external 'CloseServiceHandle@advapi32.dll stdcall';
function CreateService(hSCManager :HANDLE;lpServiceName, lpDisplayName: string;dwDesiredAccess,dwServiceType,dwStartType,dwErrorControl: cardinal;lpBinaryPathName,lpLoadOrderGroup: String; lpdwTagId : cardinal;lpDependencies,lpServiceStartName,lpPassword :string): cardinal; external 'CreateServiceA@advapi32.dll stdcall';
function DeleteService(hService :HANDLE): boolean; external 'DeleteService@advapi32.dll stdcall';
function StartNTService(hService :HANDLE;dwNumServiceArgs : cardinal;lpServiceArgVectors : cardinal) : boolean; external 'StartServiceA@advapi32.dll stdcall';
function ControlService(hService :HANDLE; dwControl :cardinal;var ServiceStatus :SERVICE_STATUS) : boolean; external 'ControlService@advapi32.dll stdcall';
function QueryServiceStatus(hService :HANDLE;var ServiceStatus :SERVICE_STATUS) : boolean; external 'QueryServiceStatus@advapi32.dll stdcall';
function QueryServiceStatusEx(hService :HANDLE;ServiceStatus :SERVICE_STATUS) : boolean; external 'QueryServiceStatus@advapi32.dll stdcall';
function OpenServiceManager() : HANDLE;
begin
if UsingWinNT() = true then begin
Result := OpenSCManager('','ServicesActive',SC_MANAGER_ALL_ACCESS);
if Result = 0 then
MsgBox('the servicemanager is not available', mbError, MB_OK)
end
else begin
MsgBox('only nt based systems support services', mbError, MB_OK)
Result := 0;
end
end;
function IsServiceInstalled(ServiceName: string) : boolean;
var
hSCM : HANDLE;
hService: HANDLE;
begin
hSCM := OpenServiceManager();
Result := false;
if hSCM <> 0 then begin
hService := OpenService(hSCM,ServiceName,SERVICE_QUERY_CONFIG);
if hService <> 0 then begin
Result := true;
CloseServiceHandle(hService)
end;
CloseServiceHandle(hSCM)
end
end;
function InstallService(FileName, ServiceName, DisplayName, Description : string;ServiceType,StartType :cardinal) : boolean;
var
hSCM : HANDLE;
hService: HANDLE;
begin
hSCM := OpenServiceManager();
Result := false;
if hSCM <> 0 then begin
hService := CreateService(hSCM,ServiceName,DisplayName,SERVICE_ALL_ACCESS,ServiceType,StartType,0,FileName,'',0,'','','');
if hService <> 0 then begin
Result := true;
// Win2K & WinXP supports aditional description text for services
if Description<> '' then
RegWriteStringValue(HKLM,'System\CurrentControlSet\Services' + ServiceName,'Description',Description);
CloseServiceHandle(hService)
end;
CloseServiceHandle(hSCM)
end
end;
function RemoveService(ServiceName: string) : boolean;
var
hSCM : HANDLE;
hService: HANDLE;
begin
hSCM := OpenServiceManager();
Result := false;
if hSCM <> 0 then begin
hService := OpenService(hSCM,ServiceName,SERVICE_DELETE);
if hService <> 0 then begin
Result := DeleteService(hService);
CloseServiceHandle(hService)
end;
CloseServiceHandle(hSCM)
end
end;
function StartService(ServiceName: string) : boolean;
var
hSCM : HANDLE;
hService: HANDLE;
begin
hSCM := OpenServiceManager();
Result := false;
if hSCM <> 0 then begin
hService := OpenService(hSCM,ServiceName,SERVICE_START);
if hService <> 0 then begin
Result := StartNTService(hService,0,0);
CloseServiceHandle(hService)
end;
CloseServiceHandle(hSCM)
end;
end;
function StopService(ServiceName: string) : boolean;
var
hSCM : HANDLE;
hService: HANDLE;
Status : SERVICE_STATUS;
begin
hSCM := OpenServiceManager();
Result := false;
if hSCM <> 0 then begin
hService := OpenService(hSCM,ServiceName,SERVICE_STOP);
if hService <> 0 then begin
Result := ControlService(hService,SERVICE_CONTROL_STOP,Status);
CloseServiceHandle(hService)
end;
CloseServiceHandle(hSCM)
end;
end;
function IsServiceRunning(ServiceName: string) : boolean;
var
hSCM : HANDLE;
hService: HANDLE;
Status : SERVICE_STATUS;
begin
hSCM := OpenServiceManager();
Result := false;
if hSCM <> 0 then begin
hService := OpenService(hSCM,ServiceName,SERVICE_QUERY_STATUS);
if hService <> 0 then begin
if QueryServiceStatus(hService,Status) then begin
Result :=(Status.dwCurrentState = SERVICE_RUNNING)
end;
CloseServiceHandle(hService)
end;
CloseServiceHandle(hSCM)
end
end;
// #######################################################################################
// create an entry in the services file
// #######################################################################################
function SetupService(service, port, comment: string) : boolean;
var
filename : string;
s : string;
lines : TArrayOfString;
n : longint;
i : longint;
errcode : integer;
servnamlen : integer;
error : boolean;
begin
if UsingWinNT() = true then
filename := ExpandConstant('{sys}\drivers\etc\services')
else
filename := ExpandConstant('{win}\services');
if LoadStringsFromFile(filename,lines) = true then begin
Result := true;
n := GetArrayLength(lines) - 1;
servnamlen := Length(service);
error := false;
for i:=0 to n do begin
if Copy(lines[i],1,1) <> '#' then begin
s := Copy(lines[i],1,servnamlen);
if CompareText(s,service) = 0 then
exit; // found service-entry
if Pos(port,lines[i]) > 0 then begin
error := true;
lines[i] := '#' + lines[i] + ' # disabled because collision with ' + service + ' service';
end;
end
else if CompareText(Copy(lines[i],2,servnamlen),service) = 0 then begin
// service-entry was disabled
Delete(lines[i],1,1);
Result := SaveStringsToFile(filename,lines,false);
exit;
end;
end;
if error = true then begin
// save disabled entries
if SaveStringsToFile(filename,lines,false) = false then begin
Result := false;
exit;
end;
end;
// create new service entry
s := service + ' ' + port + ' # ' + comment + #13#10;
if SaveStringToFile(filename,s,true) = false then begin
Result := false;
exit;
end;
if error = true then begin
MsgBox('the ' + service + ' port was already used. The old service is disabled now. You should check the services file manually now.',mbInformation,MB_OK);
Exec('notepad.exe',filename,GetCurrentDir(),SW_SHOWNORMAL,ewNoWait,errcode);
end;
end
else
Result := false;
end;
// #######################################################################################
// version functions
// #######################################################################################
function CheckVersion(Filename : string;hh,hl,lh,ll : integer) : boolean;
var
VersionMS : cardinal;
VersionLS : cardinal;
CheckMS : cardinal;
CheckLS : cardinal;
begin
if GetVersionNumbers(Filename,VersionMS,VersionLS) = false then
Result := false
else begin
CheckMS := (hh shl $10) or hl;
CheckLS := (lh shl $10) or ll;
Result := (VersionMS > CheckMS) or ((VersionMS = CheckMS) and (VersionLS >= CheckLS));
end;
end;
// Some examples for version checking
function NeedShellFolderUpdate() : boolean;
begin
Result := CheckVersion('ShFolder.dll',5,50,4027,300) = false;
end;
function NeedVCRedistUpdate() : boolean;
begin
Result := (CheckVersion('mfc42.dll',6,0,8665,0) = false)
or (CheckVersion('msvcrt.dll',6,0,8797,0) = false)
or (CheckVersion('comctl32.dll',5,80,2614,3600) = false);
end;
function NeedHTMLHelpUpdate() : boolean;
begin
Result := CheckVersion('hh.exe',4,72,0,0) = false;
end;
function NeedWinsockUpdate() : boolean;
begin
Result := (UsingWinNT() = false) and (CheckVersion('mswsock.dll',4,10,0,1656) = false);
end;
function NeedDCOMUpdate() : boolean;
begin
Result := (UsingWinNT() = false) and (CheckVersion('oleaut32.dll',2,30,0,0) = false);
end;
// function IsServiceInstalled(ServiceName: string) : boolean;
// function IsServiceRunning(ServiceName: string) : boolean;
// function InstallService(FileName, ServiceName, DisplayName, Description : string;ServiceType,StartType :cardinal) : boolean;
// function RemoveService(ServiceName: string) : boolean;
// function StartService(ServiceName: string) : boolean;
// function StopService(ServiceName: string) : boolean;
// function SetupService(service, port, comment: string) : boolean;
// function CheckVersion(Filename : string;hh,hl,lh,ll : integer) : boolean;
function InitializeSetup(): boolean;
begin
if IsServiceInstalled('myservice') = false then begin
if InstallService('c:\winnt\system32\myservice.exe','myservice','my service','my service is doing usefull things',SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START) = true then begin
StartService('myservice');
StopService('myservice');
// after stopping a service you should wait some seconds before removing
RemoveService('myservice');
// otherwise removing can fail
end
end
else if IsServiceRunning('myservice') then
MsgBox('myservice is running',mbInformation, MB_OK);
Result := false
end;[/more] Возможности: создание, удаление, проверка, запуск и остановка служб.
Artem_Butenko
Цитата:
я все с той же сумашедшей идеей создания оболочки для временной установки портабельных программ.
Я допускаю, что приложив немалые усилия, в урезанном паскале Inno можно сделать очень многое, но всё же тебе стоит переключиться на программы, специально предназначенные для создания портабельных приложений. Например, VMware ThinApp.
Подскажите пожалуйста код для того, чтобы инстал проверял букву диска с установленной виндой и ставил прогу только если системным диском является С.
В противном же случае чтобы выдавало окошко типа "У вас Windows установлена не на диск С. Установка программы невозможна и была отменена."
В противном же случае чтобы выдавало окошко типа "У вас Windows установлена не на диск С. Установка программы невозможна и была отменена."
Victor_Dobrov -- спасибо Вам за ценный совет, и, немного не в тему, подскажите патчер, умеющий извлекать путь патчинга (установки) из ключа системного реестра. Заранее очень благодарен!
Victor_Dobrov
Спасибо!
Спасибо!
Ну ктонить помогите!
san007
Цитата:
Код: [code]
function InitializeSetup(): Boolean;
begin
if ExpandConstant('{sd}')<>'C:'
then
begin
MsgBox('Windows установлена не на диск С. Установка программы невозможна.', mbError, mb_Ok);
Exit;
end;
end;
Цитата:
Подскажите пожалуйста код для того, чтобы инстал проверял букву диска с установленной виндой и ставил прогу только если системным диском является С.
В противном же случае чтобы выдавало окошко типа "У вас Windows установлена не на диск С. Установка программы невозможна и была отменена."
Код: [code]
function InitializeSetup(): Boolean;
begin
if ExpandConstant('{sd}')<>'C:'
then
begin
MsgBox('Windows установлена не на диск С. Установка программы невозможна.', mbError, mb_Ok);
Exit;
end;
end;
Что необходимо добавить в [more= скрипте][Setup]
AppName=My Program
AppVerName=My Program [Version]
DefaultDirName={pf}\My Program
[_Code]
var
Form: TSetupForm;
ExtraFilesList: TMemo;
CancelButton, DelButton: TButton;
UpImage, DownImage, Image: TBitmapImage;
UpPanel, DownPanel: TPanel;
NameLabel, DescriptionLabel, BeforeListBoxLabel: TLabel;
DownTextLabel: TLabel;
procedure FillListBox(const fromDir, fileMask: string; Level: Byte);
var
FSR, DSR: TFindRec;
FindResult: Boolean;
APath: String;
MainLen: Integer;
i: Integer;
begin
MainLen:= Length(ExpandConstant('{app}'));
APath := AddBackslash(fromDir);
FindResult := FindFirst(APath + fileMask, FSR);
try
while FindResult do
begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
begin
{files} i:= ExtraFilesList.Lines.Add(Copy(APath + FSR.Name, MainLen+2, Length(APath + FSR.Name)));
end;
FindResult := FindNext(FSR);
end;
FindResult := FindFirst(APath + '*.*', DSR);
while FindResult do
begin
if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and not ((DSR.Name = '.') or (DSR.Name = '..')) then
begin
{Recursion} FillListBox(APath + DSR.Name, fileMask, Level+1);
end;
FindResult := FindNext(DSR);
end;
finally
FindClose(FSR);
FindClose(DSR);
end;
end;
procedure DeleteFiles();
begin
DelTree(ExpandConstant('{app}'), True, True, True);
end;
procedure BrowseRemainedFiles();
begin
Form := CreateCustomForm;
Form.ClientWidth := ScaleX(504);
Form.ClientHeight := ScaleY(358);
Form.Caption := 'Paradise - InstallShield Wizard';
Form.Center;
UpImage := TBitmapImage.Create(Form);
UpImage.Top := ScaleY(0);
UpImage.Left := ScaleX(0);
UpImage.Width := Form.ClientWidth;
UpImage.Height := ScaleY(59);
UpImage.BackColor := clWhite;
UpImage.Parent := Form;
DownImage := TBitmapImage.Create(Form);
DownImage.Top := ScaleY(61);
DownImage.Left := ScaleX(0);
DownImage.Width := Form.ClientWidth;
DownImage.Height := Form.ClientHeight - DownImage.Top;
DownImage.BackColor := $EEE9EB;
DownImage.Parent := Form;
UpPanel := TPanel.Create(Form);
UpPanel.Top := ScaleY(59);
UpPanel.Width := Form.ClientWidth;
UpPanel.Height := ScaleY(2);
UpPanel.BevelOuter := bvLowered;
UpPanel.Parent := Form;
NameLabel := TLabel.Create(Form);
NameLabel.Top := ScaleY(5);
NameLabel.Left := ScaleX(16);
NameLabel.Font.Style := [fsBold];
NameLabel.Caption := 'Внимание!';
NameLabel.Color := clWhite;
NameLabel.Parent := Form;
DescriptionLabel := TLabel.Create(Form);
DescriptionLabel.Top := ScaleY(24);
DescriptionLabel.Left := ScaleX(25);
DescriptionLabel.Caption := 'Папка установки содержит посторонние файлы. Удалить их?';
DescriptionLabel.Color := clWhite;
DescriptionLabel.Parent := Form;
BeforeListBoxLabel := TLabel.Create(Form);
BeforeListBoxLabel.Top := ScaleY(68);
BeforeListBoxLabel.Left := ScaleX(25);
BeforeListBoxLabel.Caption := 'Если Вы уверены, что хотите удалить папку установки со всеми указанными файлами,'#13
'нажмите Да.'
BeforeListBoxLabel.Color := $EEE9EB;
BeforeListBoxLabel.Parent := Form;
DownPanel := TPanel.Create(Form);
DownPanel.Left := ScaleX(65);
DownPanel.Top := ScaleY(308);
DownPanel.Width := ScaleX(435);
DownPanel.Height := ScaleY(2);
DownPanel.BevelOuter := bvLowered;
DownPanel.Parent := Form;
DownTextLabel := TLabel.Create(Form);
DownTextLabel.Top := ScaleY(302);
DownTextLabel.Caption := ' InstallShield';
DownTextLabel.Font.Color := $99A8AC;
DownTextLabel.Color := $EEE9EB;
DownTextLabel.Parent := Form;
ExtraFilesList := TMemo.Create(Form);
ExtraFilesList.Left := ScaleX(25);
ExtraFilesList.Top := ScaleY(108);
ExtraFilesList.Width := Form.ClientWidth - ScaleX(50);
ExtraFilesList.Height := ScaleY(180);
ExtraFilesList.Color := $EEE9EB;
ExtraFilesList.Parent := Form;
CancelButton := TButton.Create(Form);
CancelButton.Parent := Form;
CancelButton.Width := ScaleX(75);
CancelButton.Height := ScaleY(23);
CancelButton.Left := Form.ClientWidth - CancelButton.Width - ScaleX(20);
CancelButton.Top := Form.ClientHeight - ScaleY(23 + 10);
CancelButton.Caption := 'Нет';
CancelButton.ModalResult := mrCancel;
CancelButton.Cancel := True;
DelButton := TButton.Create(Form);
DelButton.Parent := Form;
DelButton.Width := ScaleX(75);
DelButton.Height := ScaleY(23);
DelButton.Left := CancelButton.Left - DelButton.Width - ScaleX(10);
DelButton.Top := Form.ClientHeight - ScaleY(23 + 10);
DelButton.Caption := 'Да';
DelButton.ModalResult := mrOk;
Form.ActiveControl := CancelButton;
FillListBox(ExpandConstant('{app}'), '*', 1);
if ExtraFilesList.Lines.Count = 0 then
DeleteFiles()
else
if Form.ShowModal() = mrOk then DeleteFiles();
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if DirExists(ExpandConstant('{app}')) and (CurUninstallStep = usPostUninstall) then
BrowseRemainedFiles();
end;[/more] “показывающем оставшиеся после удалении файлы с вопросом на удаление” – (взято из коллекции скриптов в папке \DelSaveFiles\ DelSaveFilesRO_Memo.iss от Victor_Dobrov), что бы вверху писался полный путь установленной программы – в верху, в том же окне, где и список оставшихся после удаления файлов - в первой строке, типа “C:\Program files\My program:”. К примеру, как в пой же папке в \DelSaveFiles\DelSaveFilesRO.iss – только там с чекбоксами и деревом.
AppName=My Program
AppVerName=My Program [Version]
DefaultDirName={pf}\My Program
[_Code]
var
Form: TSetupForm;
ExtraFilesList: TMemo;
CancelButton, DelButton: TButton;
UpImage, DownImage, Image: TBitmapImage;
UpPanel, DownPanel: TPanel;
NameLabel, DescriptionLabel, BeforeListBoxLabel: TLabel;
DownTextLabel: TLabel;
procedure FillListBox(const fromDir, fileMask: string; Level: Byte);
var
FSR, DSR: TFindRec;
FindResult: Boolean;
APath: String;
MainLen: Integer;
i: Integer;
begin
MainLen:= Length(ExpandConstant('{app}'));
APath := AddBackslash(fromDir);
FindResult := FindFirst(APath + fileMask, FSR);
try
while FindResult do
begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
begin
{files} i:= ExtraFilesList.Lines.Add(Copy(APath + FSR.Name, MainLen+2, Length(APath + FSR.Name)));
end;
FindResult := FindNext(FSR);
end;
FindResult := FindFirst(APath + '*.*', DSR);
while FindResult do
begin
if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and not ((DSR.Name = '.') or (DSR.Name = '..')) then
begin
{Recursion} FillListBox(APath + DSR.Name, fileMask, Level+1);
end;
FindResult := FindNext(DSR);
end;
finally
FindClose(FSR);
FindClose(DSR);
end;
end;
procedure DeleteFiles();
begin
DelTree(ExpandConstant('{app}'), True, True, True);
end;
procedure BrowseRemainedFiles();
begin
Form := CreateCustomForm;
Form.ClientWidth := ScaleX(504);
Form.ClientHeight := ScaleY(358);
Form.Caption := 'Paradise - InstallShield Wizard';
Form.Center;
UpImage := TBitmapImage.Create(Form);
UpImage.Top := ScaleY(0);
UpImage.Left := ScaleX(0);
UpImage.Width := Form.ClientWidth;
UpImage.Height := ScaleY(59);
UpImage.BackColor := clWhite;
UpImage.Parent := Form;
DownImage := TBitmapImage.Create(Form);
DownImage.Top := ScaleY(61);
DownImage.Left := ScaleX(0);
DownImage.Width := Form.ClientWidth;
DownImage.Height := Form.ClientHeight - DownImage.Top;
DownImage.BackColor := $EEE9EB;
DownImage.Parent := Form;
UpPanel := TPanel.Create(Form);
UpPanel.Top := ScaleY(59);
UpPanel.Width := Form.ClientWidth;
UpPanel.Height := ScaleY(2);
UpPanel.BevelOuter := bvLowered;
UpPanel.Parent := Form;
NameLabel := TLabel.Create(Form);
NameLabel.Top := ScaleY(5);
NameLabel.Left := ScaleX(16);
NameLabel.Font.Style := [fsBold];
NameLabel.Caption := 'Внимание!';
NameLabel.Color := clWhite;
NameLabel.Parent := Form;
DescriptionLabel := TLabel.Create(Form);
DescriptionLabel.Top := ScaleY(24);
DescriptionLabel.Left := ScaleX(25);
DescriptionLabel.Caption := 'Папка установки содержит посторонние файлы. Удалить их?';
DescriptionLabel.Color := clWhite;
DescriptionLabel.Parent := Form;
BeforeListBoxLabel := TLabel.Create(Form);
BeforeListBoxLabel.Top := ScaleY(68);
BeforeListBoxLabel.Left := ScaleX(25);
BeforeListBoxLabel.Caption := 'Если Вы уверены, что хотите удалить папку установки со всеми указанными файлами,'#13
'нажмите Да.'
BeforeListBoxLabel.Color := $EEE9EB;
BeforeListBoxLabel.Parent := Form;
DownPanel := TPanel.Create(Form);
DownPanel.Left := ScaleX(65);
DownPanel.Top := ScaleY(308);
DownPanel.Width := ScaleX(435);
DownPanel.Height := ScaleY(2);
DownPanel.BevelOuter := bvLowered;
DownPanel.Parent := Form;
DownTextLabel := TLabel.Create(Form);
DownTextLabel.Top := ScaleY(302);
DownTextLabel.Caption := ' InstallShield';
DownTextLabel.Font.Color := $99A8AC;
DownTextLabel.Color := $EEE9EB;
DownTextLabel.Parent := Form;
ExtraFilesList := TMemo.Create(Form);
ExtraFilesList.Left := ScaleX(25);
ExtraFilesList.Top := ScaleY(108);
ExtraFilesList.Width := Form.ClientWidth - ScaleX(50);
ExtraFilesList.Height := ScaleY(180);
ExtraFilesList.Color := $EEE9EB;
ExtraFilesList.Parent := Form;
CancelButton := TButton.Create(Form);
CancelButton.Parent := Form;
CancelButton.Width := ScaleX(75);
CancelButton.Height := ScaleY(23);
CancelButton.Left := Form.ClientWidth - CancelButton.Width - ScaleX(20);
CancelButton.Top := Form.ClientHeight - ScaleY(23 + 10);
CancelButton.Caption := 'Нет';
CancelButton.ModalResult := mrCancel;
CancelButton.Cancel := True;
DelButton := TButton.Create(Form);
DelButton.Parent := Form;
DelButton.Width := ScaleX(75);
DelButton.Height := ScaleY(23);
DelButton.Left := CancelButton.Left - DelButton.Width - ScaleX(10);
DelButton.Top := Form.ClientHeight - ScaleY(23 + 10);
DelButton.Caption := 'Да';
DelButton.ModalResult := mrOk;
Form.ActiveControl := CancelButton;
FillListBox(ExpandConstant('{app}'), '*', 1);
if ExtraFilesList.Lines.Count = 0 then
DeleteFiles()
else
if Form.ShowModal() = mrOk then DeleteFiles();
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if DirExists(ExpandConstant('{app}')) and (CurUninstallStep = usPostUninstall) then
BrowseRemainedFiles();
end;[/more] “показывающем оставшиеся после удалении файлы с вопросом на удаление” – (взято из коллекции скриптов в папке \DelSaveFiles\ DelSaveFilesRO_Memo.iss от Victor_Dobrov), что бы вверху писался полный путь установленной программы – в верху, в том же окне, где и список оставшихся после удаления файлов - в первой строке, типа “C:\Program files\My program:”. К примеру, как в пой же папке в \DelSaveFiles\DelSaveFilesRO.iss – только там с чекбоксами и деревом.
omals -- ранее вы предлагали [more=скрипт][_Setup]
DefaultDirName={code:MyDirName}
[_Code]
var
IsSkipDirPage: boolean; // глобальная переменна. значение которой будет True, если страницу выбора директории нужно пропустить.
function MyDirName(S:String): String;
var
InsPath: String; // путь установки
er: boolean;
myFile:String;
begin
IsSkipDirPage := False; // по умолчание предполагаем, что страница выбора директории будет
InsPath:=ExpandConstant('{pf}\Моя компания\Мой продукт'); //если ключа и нужного файла не найдем, то ставим какой-то путь по умолчаний
er := RegQueryStringValue(HKLM, '\мой ключ в реестре\', 'InstallPath', InsPath);
if er and InsPath<>'' then //если ключ существует и там что-то записано
begin
IsSkipDirPage:=True; // запомним, что станицу выбора директории нужно пропустить
// будем ставить по старому пути , который сейчас в InsPath
end
else
begin
myFile := ExpandConstant('{src}\myfile.md5'); // тот файл шо должен лежать рядом с инсталятором
if (FileExists(myFile)) and (GetMD5OfFile(myFile)='нужное мне значени MD5') then
begin
IsSkipDirPage:=True; // запомним, что станицу выбора директории нужно пропустить
InsPath := ExpandConstant('{src}'); // будем ставить в ту же папку где находится инсталятор
end;
end;
Result := InsPath;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
if (CurPageID=wpSelectDir) and IsSkipDirPage then //если страница выбора директории и ее нужно пропустить
WizardForm.NextButton.OnClick(WizardForm.NextButton); // пропустили -- типа нажали Next
end;[/more] позволяющий организовать некоторое подобие dUP'a в Inno Setup. Я пытаюсь [more=реализовать этот скрипт на практике][_Setup]
AppName=7Z-Sfx
AppVerName=7Z-Sfx 1.0
DefaultDirName={code:MyDirName}
DefaultGroupName=7Z-Sfx
OutputBaseFilename=Setup
Compression=lzma
SolidCompression=yes
[_Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"
[_Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[_Files]
Source: "C:\Program Files\7-Zip\7z.sfx"; DestDir: "{app}"; Flags: ignoreversion
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[_Code]
var
IsSkipDirPage: boolean; // глобальная переменна. значение которой будет True, если страницу выбора директории нужно пропустить.
function MyDirName(S:String): String;
var
InsPath: String; // путь установки
er: boolean;
myFile:String;
begin
IsSkipDirPage := False; // по умолчание предполагаем, что страница выбора директории будет
InsPath:=ExpandConstant('{pf}\Моя компания\Мой продукт'); //если ключа и нужного файла не найдем, то ставим какой-то путь по умолчаний
er := RegQueryStringValue(HKLM, 'SOFTWARE\7-Zip\Path', 'InstallPath', InsPath);
if er and InsPath<>'C:\Program Files\7-Zip' then //если ключ существует и там что-то записано
begin
IsSkipDirPage:=True; // запомним, что станицу выбора директории нужно пропустить
// будем ставить по старому пути , который сейчас в InsPath
end
else
begin
myFile := ExpandConstant('{src}\7z.sfx'); // тот файл шо должен лежать рядом с инсталятором
if (FileExists(myFile)) and (GetMD5OfFile(myFile)='F454C35085538A38259BFEFCEA224DDC') then
begin
IsSkipDirPage:=True; // запомним, что станицу выбора директории нужно пропустить
InsPath := ExpandConstant('{src}'); // будем ставить в ту же папку где находится инсталятор
end;
end;
Result := InsPath;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
if (CurPageID=wpSelectDir) and IsSkipDirPage then //если страница выбора директории и ее нужно пропустить
WizardForm.NextButton.OnClick(WizardForm.NextButton); // пропустили -- типа нажали Next
end;[/more], однако у меня компиллятор ругается на 34 строку в моем скрипте. Отдельно привожу содержание ключа реестра, из которого извлекается путь установки (см. данный [more=*.reg-файл]Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\7-Zip]
"Path"="C:\\Program Files\\7-Zip"
[/more]). Пожалуйста, помогите разобраться в данном вопросе, буду весьма признателен!
DefaultDirName={code:MyDirName}
[_Code]
var
IsSkipDirPage: boolean; // глобальная переменна. значение которой будет True, если страницу выбора директории нужно пропустить.
function MyDirName(S:String): String;
var
InsPath: String; // путь установки
er: boolean;
myFile:String;
begin
IsSkipDirPage := False; // по умолчание предполагаем, что страница выбора директории будет
InsPath:=ExpandConstant('{pf}\Моя компания\Мой продукт'); //если ключа и нужного файла не найдем, то ставим какой-то путь по умолчаний
er := RegQueryStringValue(HKLM, '\мой ключ в реестре\', 'InstallPath', InsPath);
if er and InsPath<>'' then //если ключ существует и там что-то записано
begin
IsSkipDirPage:=True; // запомним, что станицу выбора директории нужно пропустить
// будем ставить по старому пути , который сейчас в InsPath
end
else
begin
myFile := ExpandConstant('{src}\myfile.md5'); // тот файл шо должен лежать рядом с инсталятором
if (FileExists(myFile)) and (GetMD5OfFile(myFile)='нужное мне значени MD5') then
begin
IsSkipDirPage:=True; // запомним, что станицу выбора директории нужно пропустить
InsPath := ExpandConstant('{src}'); // будем ставить в ту же папку где находится инсталятор
end;
end;
Result := InsPath;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
if (CurPageID=wpSelectDir) and IsSkipDirPage then //если страница выбора директории и ее нужно пропустить
WizardForm.NextButton.OnClick(WizardForm.NextButton); // пропустили -- типа нажали Next
end;[/more] позволяющий организовать некоторое подобие dUP'a в Inno Setup. Я пытаюсь [more=реализовать этот скрипт на практике][_Setup]
AppName=7Z-Sfx
AppVerName=7Z-Sfx 1.0
DefaultDirName={code:MyDirName}
DefaultGroupName=7Z-Sfx
OutputBaseFilename=Setup
Compression=lzma
SolidCompression=yes
[_Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"
[_Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[_Files]
Source: "C:\Program Files\7-Zip\7z.sfx"; DestDir: "{app}"; Flags: ignoreversion
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[_Code]
var
IsSkipDirPage: boolean; // глобальная переменна. значение которой будет True, если страницу выбора директории нужно пропустить.
function MyDirName(S:String): String;
var
InsPath: String; // путь установки
er: boolean;
myFile:String;
begin
IsSkipDirPage := False; // по умолчание предполагаем, что страница выбора директории будет
InsPath:=ExpandConstant('{pf}\Моя компания\Мой продукт'); //если ключа и нужного файла не найдем, то ставим какой-то путь по умолчаний
er := RegQueryStringValue(HKLM, 'SOFTWARE\7-Zip\Path', 'InstallPath', InsPath);
if er and InsPath<>'C:\Program Files\7-Zip' then //если ключ существует и там что-то записано
begin
IsSkipDirPage:=True; // запомним, что станицу выбора директории нужно пропустить
// будем ставить по старому пути , который сейчас в InsPath
end
else
begin
myFile := ExpandConstant('{src}\7z.sfx'); // тот файл шо должен лежать рядом с инсталятором
if (FileExists(myFile)) and (GetMD5OfFile(myFile)='F454C35085538A38259BFEFCEA224DDC') then
begin
IsSkipDirPage:=True; // запомним, что станицу выбора директории нужно пропустить
InsPath := ExpandConstant('{src}'); // будем ставить в ту же папку где находится инсталятор
end;
end;
Result := InsPath;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
if (CurPageID=wpSelectDir) and IsSkipDirPage then //если страница выбора директории и ее нужно пропустить
WizardForm.NextButton.OnClick(WizardForm.NextButton); // пропустили -- типа нажали Next
end;[/more], однако у меня компиллятор ругается на 34 строку в моем скрипте. Отдельно привожу содержание ключа реестра, из которого извлекается путь установки (см. данный [more=*.reg-файл]Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\7-Zip]
"Path"="C:\\Program Files\\7-Zip"
[/more]). Пожалуйста, помогите разобраться в данном вопросе, буду весьма признателен!
Artem_Butenko
Цитата:
Второе условие нужно взять в скобки.
Код: if er and (InsPath<>'C:\Program Files\7-Zip') then //если ключ существует и там что-то записано
Цитата:
компиллятор ругается на 34 строкуОшибка обработки оператора AND.
Второе условие нужно взять в скобки.
Код: if er and (InsPath<>'C:\Program Files\7-Zip') then //если ключ существует и там что-то записано
Artem_Butenko
как и сказал LordVeider
нужно if er and (InsPath<>'C:\Program Files\7-Zip') then
сорь забыл о порядке выполнения
LordVeider ну зачем уж так "оптимизировать" то?
как и сказал LordVeider
нужно if er and (InsPath<>'C:\Program Files\7-Zip') then
сорь забыл о порядке выполнения
LordVeider ну зачем уж так "оптимизировать" то?
omals
LordVeider
Спасибо Вам ребята за помощь, только вот я еще не совсем понял некоторые звенья скрипта. Да, согласен, это неплохая заготовка для создания инсталлятора - патчера. Но, очень хочется видеть реализацию следующих возможностей в данном скрипте (при условии, что инсталлятор м.б. выполнен в "тихом" варианте, или страница выбора директории установки также м.б. отключена):
А) если рядом с исполнительным файлом инсталлятора находится некоторый файл (инсталлятор должен проверить его имя и md5-хэш), то распаковка файлов происходит в корневой каталог, в котором и находится инсталлятор;
Б) если некоторый внешний файл отсутствует или не удовлетворяет проверке md5-хэша, и директория установки не определена из ключа системного реестра, то должно появляться диалоговое окно "Обзор папок", в котором пользователь может выбрать каталог назначения и при нажатии "Ok", инсталлятор распакует файлы в выбранную директорию.
Большая просьба не отсылайте меня изучать dUP, ведь на Inno Setup можно сделать многое (например, автораны, эмулировать инсталляторы EA), вот и у меня сокровенная мечта, сделать оболочку патчера на Inno Setup, но к сожалению самостоятельно разобрать условия описанные в пунктах А) и Б) я не смогу, поэтому искренне надеюсь на Вашу помощь.
LordVeider
Спасибо Вам ребята за помощь, только вот я еще не совсем понял некоторые звенья скрипта. Да, согласен, это неплохая заготовка для создания инсталлятора - патчера. Но, очень хочется видеть реализацию следующих возможностей в данном скрипте (при условии, что инсталлятор м.б. выполнен в "тихом" варианте, или страница выбора директории установки также м.б. отключена):
А) если рядом с исполнительным файлом инсталлятора находится некоторый файл (инсталлятор должен проверить его имя и md5-хэш), то распаковка файлов происходит в корневой каталог, в котором и находится инсталлятор;
Б) если некоторый внешний файл отсутствует или не удовлетворяет проверке md5-хэша, и директория установки не определена из ключа системного реестра, то должно появляться диалоговое окно "Обзор папок", в котором пользователь может выбрать каталог назначения и при нажатии "Ok", инсталлятор распакует файлы в выбранную директорию.
Большая просьба не отсылайте меня изучать dUP, ведь на Inno Setup можно сделать многое (например, автораны, эмулировать инсталляторы EA), вот и у меня сокровенная мечта, сделать оболочку патчера на Inno Setup, но к сожалению самостоятельно разобрать условия описанные в пунктах А) и Б) я не смогу, поэтому искренне надеюсь на Вашу помощь.
А где можно почитать про изменение внешнего вида мастера? Конкретно интересует как наложить текстуры (причем 3 штуки, что бы при наведении и нажатии на кнопку они менялись) на кнопки "Закрыть" и "Свернуть". Так же интересно узнать как убрать эти кнопки. и Еще интересует как изменить цвет заголовка активного окна инсталятора.
Последний вопрос я уже задовал совсем недавно, но ответа так и не последовало((
Буду благодарен за предоставление любой полезной информации по этим вопросам.
Последний вопрос я уже задовал совсем недавно, но ответа так и не последовало((
Буду благодарен за предоставление любой полезной информации по этим вопросам.
Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
Предыдущая тема: в очередной раз босудим антивиры?
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.