htuos
Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Код: #define MyAppName "AmmyyAdmin Setup" #define MyAppVersion "3.5" #define MyAppExeName "AA_v3.exe" [Setup] AppId={{F60BFCDB-3F0B-48A0-B33D-F6198FD8BD08} AppName={#MyAppName} AppVersion={#MyAppVersion} DefaultDirName={pf}\AmmyyAdmin DefaultGroupName=AmmyyAdmin OutputDir=. OutputBaseFilename=AmmyySetup Compression=lzma SolidCompression=yes DisableDirPage=yes DisableProgramGroupPage=yes DisableFinishedPage=yes DisableReadyPage=yes DisableWelcomePage=yes [Languages] Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl" [Files] ;Source: ".\contacts3.bin"; DestDir: "{app}"; Flags: ignoreversion Source: ".\settings3.bin"; DestDir: "{app}"; Flags: ignoreversion Source: ".\AA_v3.exe"; DestDir: "{app}"; Flags: ignoreversion; BeforeInstall: RemoveAmmyyService; AfterInstall: InstallAmmyyService [Code_] type HANDLE = Cardinal; SERVICE_STATUS = record dwServiceType : Cardinal; dwCurrentState : Cardinal; dwControlsAccepted : Cardinal; dwWin32ExitCode : Cardinal; dwServiceSpecificExitCode : Cardinal; dwCheckPoint : Cardinal; dwWaitHint : Cardinal; end; const SC_MANAGER_CONNECT = $0001; SC_MANAGER_CREATE_SERVICE = $0002; SC_MANAGER_ALL_ACCESS = $f003f; SERVICE_CHANGE_CONFIG = $2; SERVICE_QUERY_STATUS = $4; SERVICE_START = $10; SERVICE_STOP = $20; SERVICE_WIN32_OWN_PROCESS = $10; SERVICE_AUTO_START = $2; SERVICE_DELETE = $10000; SERVICE_CONTROL_STOP = $1; SERVICE_STOPPED = $1; SERVICE_RUNNING = $4; function OpenSCManager(lpMachineName, lpDatabaseName: string; dwDesiredAccess: Cardinal): HANDLE; external 'OpenSCManagerW@advapi32.dll stdcall'; function OpenService(hSCManager: HANDLE; lpServiceName: string; dwDesiredAccess: Cardinal): HANDLE; external 'OpenServiceW@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 'CreateServiceW@advapi32.dll stdcall'; function DeleteService(hService: HANDLE): boolean; external 'DeleteService@advapi32.dll stdcall'; function StartService_(hService: HANDLE; dwNumServiceArgs: Cardinal; lpServiceArgVectors: Cardinal): boolean; external 'StartServiceW@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 IsServiceInstalled(ServiceName: string): boolean; var hSCM: HANDLE; hService: HANDLE; begin hSCM := OpenSCManager('', 'ServicesActive', SC_MANAGER_CONNECT); Result := False; if hSCM <> 0 then begin hService := OpenService(hSCM,ServiceName, SERVICE_QUERY_STATUS); 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 := OpenSCManager('', 'ServicesActive', SC_MANAGER_CREATE_SERVICE); Result := False; if hSCM <> 0 then begin hService := CreateService(hSCM, ServiceName, DisplayName, SERVICE_CHANGE_CONFIG, ServiceType, StartType, 0, FileName, '', 0, '', '', ''); if hService <> 0 then begin Result := True; 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 := OpenSCManager('', 'ServicesActive', SC_MANAGER_ALL_ACCESS); 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; Status: SERVICE_STATUS; dwCheckPoint: Cardinal; begin hSCM := OpenSCManager('', 'ServicesActive', SC_MANAGER_CONNECT); if hSCM <> 0 then begin hService := OpenService(hSCM, ServiceName, SERVICE_START or SERVICE_QUERY_STATUS); if hService <> 0 then begin if StartService_(hService, 0, 0) then begin if QueryServiceStatus(hService, Status) then begin while Status.dwCurrentState <> SERVICE_RUNNING do begin dwCheckPoint := Status.dwCheckPoint; Sleep(Status.dwWaitHint); if (not QueryServiceStatus(hService, Status)) then Break; if (Status.dwCheckPoint < dwCheckPoint) then Break; end; end; end; CloseServiceHandle(hService); end; CloseServiceHandle(hSCM); end; Result := Status.dwCurrentState = SERVICE_RUNNING; end; function StopService(ServiceName: string): boolean; var hSCM: HANDLE; hService: HANDLE; Status: SERVICE_STATUS; dwCheckPoint: Cardinal; begin hSCM := OpenSCManager('', 'ServicesActive', SC_MANAGER_CONNECT); if hSCM > 0 then begin hService := OpenService(hSCM, ServiceName, SERVICE_STOP or SERVICE_QUERY_STATUS); if hService > 0 then begin if ControlService(hService, SERVICE_CONTROL_STOP, Status) then begin if QueryServiceStatus(hService, Status) then begin while Status.dwCurrentState <> SERVICE_STOPPED do begin dwCheckPoint := Status.dwCheckPoint; Sleep(Status.dwWaitHint); if not QueryServiceStatus(hService, Status) then Break; if Status.dwCheckPoint < dwCheckPoint then Break; end; end; end; CloseServiceHandle(hService); end; CloseServiceHandle(hSCM); end; Result := Status.dwCurrentState = SERVICE_STOPPED; end; function IsServiceRunning(ServiceName: string) : boolean; var hSCM: HANDLE; hService: HANDLE; Status: SERVICE_STATUS; begin hSCM := OpenSCManager('', 'ServicesActive', SC_MANAGER_CONNECT); Result := False; if hSCM <> 0 then begin hService := OpenService(hSCM, ServiceName, SERVICE_QUERY_STATUS); if hService <> 0 then begin if QueryServiceStatus(hService, Status) then Result :=(Status.dwCurrentState = SERVICE_RUNNING); CloseServiceHandle(hService); end; CloseServiceHandle(hSCM); end; end; procedure RemoveAmmyyService; begin if IsServiceInstalled('AmmyyAdmin') then begin if IsServiceRunning('AmmyyAdmin') then StopService('AmmyyAdmin'); RemoveService('AmmyyAdmin'); end; end; procedure InstallAmmyyService; begin if not IsServiceInstalled('AmmyyAdmin') then if InstallService('"' + ExpandConstant('{app}') + '\AA_v3.exe" -service -debug', 'AmmyyAdmin', 'Ammyy Admin', '', SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START) then StartService('AmmyyAdmin'); end; procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); begin if CurUninstallStep = usUninstall then RemoveAmmyyService; end; | | Всего записей: 335 | Зарегистр. 06-03-2008 | Отправлено: 15:25 19-02-2015 | Исправлено: htuos, 15:43 19-02-2015 |
|