#define MyAppName "CB App Test" #define MyAppVerName "CB App Test" #define MyAppPublisher "SigmaSoft International Inc." #define MyAppURL "http://SigmaSoft.com" #define MyAppExeName "cb.exe" [Setup] AppName={#MyAppName} AppVerName={#MyAppVerName} AppId=SSL1 AppPublisher={#MyAppPublisher} AppPublisherURL={#MyAppURL} AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppURL} DefaultDirName={pf}\{#MyAppName} AppVersion=1.0 DefaultGroupName={#MyAppVerName} Compression=lzma SolidCompression=true OutputBaseFilename={#MyAppName} setup CreateAppDir=no DisableProgramGroupPage=yes [Messages] BeveledLabel=© 2006 Samaan Systems Ltd. [Files] ;********************************************************************** ; ; searchserver component files ; ;********************************************************************** Source: C:\Program Files\Netrics\netricsd-3.3.11-ET-eval.exe; DestDir: {code:GetSearchDir}; Flags: ignoreversion; BeforeInstall: DoPreInstall(); AfterInstall: DoServiceInstall('{code:GetSearchDir}\netricsd-3.3.11-ET-eval.exe') [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; var SearchDirPage: TInputDirWizardPage; procedure InitializeWizard; begin { Create the search directory page } SearchDirPage := CreateInputDirPage( wpSelectComponents, 'Select Search Server Directory', 'Where should the Search Server files be installed?', 'Setup will install the Search Server files into the following folder.', False, 'New Folder'); SearchDirPage.Add( 'To continue, click Next. If you would like to select a different location, click Browse'); end; procedure RegisterPreviousData( PreviousDataKey: Integer); begin { Save the DataDir setting so we can restore it next time } SetPreviousData( PreviousDataKey, 'SearchDir', SearchDirPage.Values[0]); end; procedure CurPageChanged(curPageID: Integer); begin if CurPageID = SearchDirPage.ID then SearchDirPage.Values[0] := GetPreviousData('SearchDir', ExpandConstant('{pf}') + '\CB Test') end; function GetSearchDir( S: String): String; begin { Return the selected DataDir } Result := SearchDirPage.Values[0]; end; // // 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 GetPathInstalled( AppID: String ): String; var sPrevPath: String; begin sPrevPath := ''; if not RegQueryStringValue( HKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall'+AppID+'_is1', 'Inno Setup: App Path', sPrevpath) then RegQueryStringValue( HKCU, 'Software\Microsoft\Windows\CurrentVersion\Uninstall'+AppID+'_is1' , 'Inno Setup: App Path', sPrevpath); Result := sPrevPath; end; function OpenServiceManager() : HANDLE; begin if UsingWinNT() 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; procedure DoPreInstall(); var i:integer; begin if IsServiceInstalled('Netrics Search Server') then begin If StopService('Netrics Search Server') then begin i := 0; while isServiceRunning('Netrics Search Server') and (i<10) do begin sleep(2000); i := i + 1; end; If (i>=10) then msgbox('Could not stop Netrics Search Server',mbError, MB_OK); end else msgbox('Could not stop Netrics Search Server',mbError, MB_OK); end; end; Procedure DoserviceInstall( fname: string); var filename:string; begin if not IsServiceInstalled('Netrics Search Server') then begin filename := expandConstant(fname); msgbox('Service does not exist',mbInformation,MB_OK); if InstallService(filename,'Netrics Search Server','Netrics Search Server','Netrics Search Server',SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START) = true then begin if StartService('Netrics Search Server') then msgbox('Service installed successfully',mbInformation,MB_OK) else msgbox('Service installed but could not be started',mbInformation,MB_OK); end else msgbox('Attempt to install Netrics Search Server failed',mbError,MB_OK); end else begin msgbox('Service does exist',mbInformation,MB_OK); if StartService('Netrics Search Server') then msgbox('Service installed successfully',mbInformation,MB_OK) else msgbox('Service installed but could not be started',mbInformation,MB_OK); end; end; // // version functions // function CheckVersion(Filename : string;hh,hl,lh,ll : integer) : boolean; var VersionMS : cardinal; VersionLS : cardinal; CheckMS : cardinal; CheckLS : cardinal; begin if not GetVersionNumbers(Filename,VersionMS,VersionLS)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; function InitializeUninstall(): Boolean; var i:integer; begin if IsServiceInstalled('Netrics Search Server') then begin If StopService('Netrics Search Server') then begin i := 0; while isServiceRunning('Netrics Search Server') and (i<10) do begin sleep(2000); i := i + 1; end; If (i>=10) then msgbox('Could not stop Netrics Search Server',mbError, MB_OK) else begin If RemoveService('Netrics Search Server') then begin // msgbox('Netrics Search Server service successfully uninstalled',mbInformation, MB_OK) end else msgbox('Failed to remove Netrics Search Server service',mberror, MB_OK); end; end else msgbox('Could not stop Netrics Search Server service',mbError, MB_OK); end; end;