Вот при таком коде xcopy видна в процессах на секунду, зетем опять вылетает(естественно своих функций не выполняет):
| Код |
program OMK_srvn1;
{$APPTYPE CONSOLE}
uses windows, winsvc, SysUtils, ShellApi; const c_ServiceName = 'OMK_srvn1'; var DispatchTable : array [0..1] of _SERVICE_TABLE_ENTRYW; var sst : SERVICE_STATUS; var sstHandle : SERVICE_STATUS_HANDLE; var handle: THandle; var si: STARTUPINFO; pi: PROCESS_INFORMATION; cmdline: string; /////////////////////////////////////////////////////////////////////// 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_STOPPED; sst.dwCheckPoint :=0; sst.dwWaitHint :=0; SetServiceStatus1; exit; end;
SERVICE_CONTROL_INTERROGATE : ; end;
SetServiceStatus1; end;
///////////////////////////////////////////////////////////////////////
procedure copy; //var si: STARTUPINFO; // pi: PROCESS_INFORMATION; // cmdline: string; begin
sleep(10000); // ZeroMemory(@si,sizeof(si)); // si.cb:=SizeOf(si); // cmdline:='d:\Level2\DA_report_cr_multi\REP_QUALITY\CoilManager_QUALITY_REP_*.pdf q: /Q'; // if not CreateProcess( PChar('C:\WINDOWS\system32\xcopy.exe'), { No module name (use command line). } // PChar(cmdline), { Command line. } // nil, { Process handle not inheritable. } // nil, { Thread handle not inheritable. } // False, { Set handle inheritance to FALSE. } // 0, { No creation flags. } // nil, { Use parent's environment block. } // nil, { Use parent's starting directory. } // si, { Pointer to STARTUPINFO structure. } // pi ) { Pointer to PROCESS_INFORMATION structure. } // then // Exit; // WaitForSingleObject( pi.hProcess, INFINITE ); // CloseHandle( pi.hProcess ); // CloseHandle( pi.hThread );
try FillChar(SI, SizeOf(SI), 0); SI.cb := SizeOf(SI); SI.dwFlags := STARTF_FORCEONFEEDBACK or STARTF_USESHOWWINDOW; // SI.wShowWindow := Flag; if CreateProcessAsUser(Handle, PChar('C:\WINDOWS\system32\xcopy.exe'), PChar('d:\Level2\DA_report_cr_multi\REP_QUALITY\CoilManager_QUALITY_REP_*.pdf q: /Q'), nil, nil, false, CREATE_NEW_CONSOLE, nil, nil, SI, PI) then begin CloseHandle(PI.hThread); end; finally CloseHandle(Handle);
end;
end;
/////////////////////////////////////////////////////////////////////// procedure ServiceProc(argc : DWORD;var argv : array of PChar);stdcall; var F: TSearchRec; files,mls,path,source: string; Attr,intFileAge1,intFileAge2: Integer; si: STARTUPINFO; pi: PROCESS_INFORMATION; cmdline: string;
begin path:='d:\Level2\DA_report_cr_multi\REP_QUALITY\'; //ParamStr(1) source:='c:\REPORTS\'; // \\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 := 0;
sstHandle := RegisterServiceCtrlHandler(c_ServiceName,@ServiceCtrlHandler);
if sstHandle = 0 then RaiseLastOSError;
sst.dwCurrentState :=SERVICE_RUNNING; sst.dwCheckPoint :=0; sst.dwWaitHint :=0;
SetServiceStatus1;
//ОСНОВНОЙ КОД ПРОГРАММЫ repeat
copy; until sst.dwCurrentState = SERVICE_STOPPED; end;
///////////////////////////////////////////////////////////////////////
var schService, schSCManager: SC_HANDLE; var binExe: pchar; 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, // 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;
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; 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;
end.
|
|