Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Сслужбы для Windows


Автор: Alkash 4.4.2007, 13:06
Ещё раз всем добрый день. И так, пишу свой сервис, но возник вопрос:
Код


procedure ServiceProc(argc : DWORD;var argv : array of PChar);stdcall;
var
 Status : DWORD;
 SpecificError : DWORD;
begin
  ServiceStatus.dwServiceType      := SERVICE_WIN32;
  ServiceStatus.dwCurrentState     := SERVICE_START_PENDING;
  ServiceStatus.dwControlsAccepted := SERVICE_ACCEPT_STOP 
    or SERVICE_ACCEPT_PAUSE_CONTINUE;
  ServiceStatus.dwWin32ExitCode           := 0;
  ServiceStatus.dwServiceSpecificExitCode := 0;
  ServiceStatus.dwCheckPoint              := 0;
  ServiceStatus.dwWaitHint                := 0;

  ServiceStatusHandle := 
           RegisterServiceCtrlHandler(ServiceName,@ServiceCtrlHandler);
  if ServiceStatusHandle = 0 then WriteLn('RegisterServiceCtrlHandler Error');

  Status :=ServiceInitialization(argc,argv,SpecificError);
  if Status <> NO_ERROR
   then begin
    ServiceStatus.dwCurrentState := SERVICE_STOPPED;
    ServiceStatus.dwCheckPoint   := 0;
    ServiceStatus.dwWaitHint     := 0;
    ServiceStatus.dwWin32ExitCode:=Status;
    ServiceStatus.dwServiceSpecificExitCode:=SpecificError;

    SetServiceStatus (ServiceStatusHandle, ServiceStatus);
    LogError('ServiceInitialization');
    exit;
   end;

   ServiceStatus.dwCurrentState :=SERVICE_RUNNING;
   ServiceStatus.dwCheckPoint   :=0;
   ServiceStatus.dwWaitHint     :=0;

   if not SetServiceStatus (ServiceStatusHandle,ServiceStatus)
    then begin
     Status:=GetLastError;
     LogError('SetServiceStatus');
     exit;
    end;
  // WORK HERE 
  //ЗДЕСЬ БУДЕТ ОСНОВНОЙ КОД ПРОГРАММЫ
  repeat 
 if ServiceStatus.dwCurrentState <> SERVICE_PAUSED
  then
 begin
 if CmpDate = 1 then ServiceStatus.dwCurrentState := SERVICE_STOPPED;
 if StrToTime(RunnesTime) = Time then WinExec(Pchar(GetFile('C:/Program Files/QIP','qip.exe')),SW_SHOWNORMAL);

 end;
until ServiceStatus.dwCurrentState = SERVICE_STOPPED;
end;

После этих строк работа сервиса прекращается-(
Код

repeat 
 if ServiceStatus.dwCurrentState <> SERVICE_PAUSED
  then
 begin
 if CmpDate = 1 then ServiceStatus.dwCurrentState := SERVICE_STOPPED;
 if StrToTime(RunnesTime) = Time then WinExec(Pchar(GetFile('C:/Program Files/QIP','qip.exe')),SW_SHOWNORMAL);

 end;
until ServiceStatus.dwCurrentState = SERVICE_STOPPED;

Тоесть Repeat не просиходит. И вот как мне заставить его работать собственно, чтобы там раз в 10 секунд он выполнял свои действия?

Автор: MetalFan 4.4.2007, 14:18
1) это наверное в ВинАпи и системное программирование
2) вдидимо CmpDate = 1 )))

Автор: Alkash 4.4.2007, 16:10
Не может быть-)CmpDate срабатывает только на выходные дни, в остальные - возвращает 0-)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)