program OMK_srvn1;
{$APPTYPE CONSOLE}
uses
windows,
winsvc,
SysUtils;
const c_ServiceName = 'OMK_srvn1';
var DispatchTable : array [0..1] of _SERVICE_TABLE_ENTRYW;//_SERVICE_TABLE_ENTRYW;
var sst : SERVICE_STATUS;
var sstHandle : SERVICE_STATUS_HANDLE;
var schService, schSCManager: SC_HANDLE;
var binExe: pchar;
pac: PAnsiChar;
///////////////////////////////////////////////////////////////////////
procedure SetServiceStatus1;
begin
if not SetServiceStatus(sstHandle,sst) then
RaiseLastOSError;
end;
///////////////////////////////////////////////////////////////////////
procedure ServiceCtrlHandler(Opcode : Cardinal);stdcall;
begin
case Opcode of
SERVICE_CONTROL_STOP:
begin
sst.dwWin32ExitCode:=0;
sst.dwCurrentState := SERVICE_STOP_PENDING;//; SERVICE_STOPPED
sst.dwCheckPoint :=0;
sst.dwWaitHint :=10000;
SetServiceStatus1;
exit;
end;
SERVICE_CONTROL_INTERROGATE :;
end;
SetServiceStatus1;
end;
///////////////////////////////////////////////////////////////////////
procedure ServiceProc(argc : DWORD;var argv : array of PChar);stdcall;
var F: TSearchRec;
files,mls,path,source: string;
Attr,intFileAge1,intFileAge2: Integer;
begin
path:='c:\test\'; //ParamStr(1)
source:='x:\test\'; // \\127.0.0.1\c$\
files:='';
Attr:= faAnyFile;
intFileAge1:=0;
intFileAge2:=0;
sst.dwServiceType := SERVICE_WIN32;
sst.dwCurrentState := SERVICE_START_PENDING;
sst.dwControlsAccepted := SERVICE_ACCEPT_STOP;
// or SERVICE_ACCEPT_PAUSE_CONTINUE;
sst.dwWin32ExitCode := 0;
sst.dwServiceSpecificExitCode := 0;
sst.dwCheckPoint := 0;
sst.dwWaitHint := 10000;
sstHandle :=
RegisterServiceCtrlHandler(c_ServiceName,@ServiceCtrlHandler);
if sstHandle = 0 then RaiseLastOSError;
sst.dwCurrentState :=SERVICE_RUNNING;
sst.dwCheckPoint :=0;
sst.dwWaitHint :=10000;
SetServiceStatus1;
//ОСНОВНОЙ КОД ПРОГРАММЫ
repeat
sleep(1000);
// sleep(90000);
// sleep(StrToInt64(mls));
// FindFirst(Path+'1*.*', Attr, F);
FindFirst(Path+'*.*', Attr, F); //CoilManager_QUALITY_REP_
if F.name <> '' then files:= F.Name;
if intFileAge1 <> intFileAge2 then
CopyFile(PChar(path + files),PChar(source+files),false);
// MoveFile(PChar(path + files),PChar(source+files));
while (FindNext(F) = 0) do
begin
files:=F.Name;
intFileAge1 := sysutils.FileAge(path + files);
intFileAge2 := sysutils.FileAge(source+files);
if intFileAge1 <> intFileAge2 then
CopyFile(PChar(path + files),PChar(source+files),false);
// MoveFile(PChar(path + files),PChar(source+files));
if sst.dwCurrentState = SERVICE_STOP_PENDING then
SetServiceStatus1;
end;
FindClose(F);
until sst.dwCurrentState = SERVICE_STOP_PENDING;
sst.dwWin32ExitCode:=0;
sst.dwCurrentState := SERVICE_STOPPED;
sst.dwCheckPoint :=0;
sst.dwWaitHint :=10000;
SetServiceStatus1;
end;
procedure sService(P: Pointer); stdcall;
begin
///////////////////////////// Запуск службы
writeln('Start thread)');
end;
///////////////////////////////////////////////////////////////////////
//var ThreadID: DWORD;
// HThread: THandle;
begin
{ if ParamStr(1)='' then begin
writeln('Enter parameter "/?" for help(example: OMK_srvn.exe /?)');
exit;
end;
if ParamStr(1)='/?' then begin
writeln('This program(service) move DAS files.');
writeln('Enter parameters for starting: /i-install service | /d-delete service');
exit;
end;
if (ParamStr(1)<>'/i') and (ParamStr(1)<>'/d') then begin
writeln('Enter parameters for starting: /i-install service | /d-delete service');
exit;
end;
}
if ParamStr(1)='/i' then begin
binExe:=pchar(ParamStr(0));
///////////////////////////// Установка службы
schSCManager := OpenSCManager(
nil, // local machine
nil, // ServicesActive database
SC_MANAGER_ALL_ACCESS); // full access rights
if schSCManager=0 then RaiseLastOSError;
schService := CreateService(
schSCManager, // SCManager database
c_ServiceName, // name of service
c_ServiceName, // service name to display
SERVICE_ALL_ACCESS, // desired access
SERVICE_WIN32_OWN_PROCESS, // service type
SERVICE_DEMAND_START,//, SERVICE_AUTO_START // start type
SERVICE_ERROR_NORMAL, // error control type
binExe, // service's binary
nil, // no load ordering group
nil, // no tag identifier
nil, // no dependencies
nil, // LocalSystem account
nil); // no password
if schService=0 then
RaiseLastOSError;
if not CloseServiceHandle(schService) then
RaiseLastOSError;
if not CloseServiceHandle(schSCManager) then
RaiseLastOSError;
exit;
///////////////////////////// Удаление службы
end else if ParamStr(1)='/d' then begin
schSCManager := OpenSCManager(
nil, // local machine
nil, // ServicesActive database
SC_MANAGER_ALL_ACCESS); // full access rights
if schSCManager=0 then RaiseLastOSError;
schService := OpenService(
schSCManager, // SCManager database
c_ServiceName, // name of service
SERVICE_ALL_ACCESS); // only need DELETE access
if schService = 0 then
RaiseLastOSError;
if not DeleteService(schService) then
RaiseLastOSError;
if not CloseServiceHandle(schService) then
RaiseLastOSError;
if not CloseServiceHandle(schSCManager) then
RaiseLastOSError;
exit;
end;
DispatchTable[0].lpServiceName:=c_ServiceName;
DispatchTable[0].lpServiceProc:=@ServiceProc;
DispatchTable[1].lpServiceName:=nil;
DispatchTable[1].lpServiceProc:=nil;
if not StartServiceCtrlDispatcher(DispatchTable[0]) then
RaiseLastOSError;
//HThread := CreateThread(nil, 0, @sService,nil, 0, ThreadID);
//WaitForSingleObject(HThread,10000);
end.