Re: Отладка сервисов!!!
От: glh Россия  
Дата: 11.08.06 14:01
Оценка:
Здравствуйте, Yanish, Вы писали:

Y>Я почитал многое по поводу отладки сервисов. Чего только не предлагали:

Y>И всё ето не то!!!

Y>

Y>А ктонибудь знает что нужно сделать, чтобы сервис можно было отлаживать как обыкновенный exe`шник, нажал F9 и всё прекрасно начинает проверяться!!!!!!!


Самый простой вариант

Напиши так, что бы работало в 2 режимах, как приложение и как сервис.

где нибудь, у меня в exSvcUtils
var//Глобальная переменная, должна показывать что исполняемся в режиме сервиса
  IsService: Boolean = False;

{ Сервис запущен в режиме установки/удаления }
function SvcIsInstallMode: Boolean;
begin
  Result := FindCmdLineSwitch('INSTALL') or FindCmdLineSwitch('UNINSTALL');
end;

{ Проверяем возможность запуска в режиме сервиса, TRUE если можем }
function SvcCanStart(const sSvc: string; sUser: string = ''): Boolean;
var
  schm: SC_Handle;// service control manager handle
  schs: SC_Handle;// service handle
  ServiceStartName: string;
  lpqscConfig: PQueryServiceConfig;
  dwSize: DWord;
  s: string;
begin
  Result := False;
  schm := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if _failed(schm) then Exit;

  schs := OpenService(schm, PChar(sSvc), SERVICE_ALL_ACCESS);
  if _failed(schs) then Exit;

  dwSize := 0;
  QueryServiceConfig(schs, nil, 0, dwSize);
  lpqscConfig := AllocMem(dwSize);
  try
    QueryServiceConfig(schs, lpqscConfig, dwSize, dwSize);
    ServiceStartName := PQueryServiceConfig(lpqscConfig)^.lpServiceStartName;
    if SameText(ServiceStartName, 'LocalSystem') then
      ServiceStartName := 'SYSTEM';
  finally
    Dispose(lpqscConfig);
  end;

  CloseServiceHandle(schs);
  CloseServiceHandle(schm);

  sUser := GetCompUser();
  // здесь пытаемся обработать ситуацию когда указано от имени кого запускать сервис
  if Pos('@', ServiceStartName) <> 0 then begin
    s := RegStringValueGet('System\CurrentControlSet\Services\Tcpip\Parameters', 'Domain', HKEY_LOCAL_MACHINE);
    if s <> '' then
      sUser := sUser +'@'+ s;
  end;

  Result := SameText(ServiceStartName, sUser);
end;


UsesCommon.inc
    exSvcDesktop//must be FIRST!
  , exSvcUtils
  , SvcMgr
  , Forms
  rmTypes in '..\..\rm.common\rmTypes.pas',
  ServiceOptions in '..\svc.common\ServiceOptions.pas',
  ServiceCommon in '..\svc.common\ServiceCommon.pas',
  CmdProcessor in '..\svc.common\CmdProcessor.pas',
  SrvCmdDecoder in '..\svc.common\SrvCmdDecoder.pas',
  dMain in '..\svc.common\dMain.pas' {dmMain: TDataModule},


PrjCommon.inc:
  if SvcIsInstallMode() or SvcCanStart(GetServiceName())
    then begin// Start as service
      SvcMgr.Application.Initialize;
      exSvcUtils.IsService := True;
      SvcMgr.Application.CreateForm(TdmMain, dmMain);
      // удален ресурс, поэтому создаем из кода
      svcService := TsvcServiceCommon.CreateNew(SvcMgr.Application);
      SvcMgr.Application.Run;
    end
    else begin// Start as application
      Application.Initialize;
      Application.CreateForm(TdmMain, dmMain);
      while not Application.Terminated do
        Application.HandleMessage;
      Application.Terminate;
    end;


пример проекта:
program mngFTPin;

uses
{$I ..\svc.common\UsesCommon.inc}
  ftpLoaders in '..\svc.common\ftpLoaders.pas',
  ftpInServiceMng in 'ftpInServiceMng.pas';

{$R '..\svc.res\mainicon.res' '..\svc.res\mainicon.rc'}
{$R 'VersionInfo.res' 'VersionInfo.rc'}

begin
{$I ..\svc.common\PrjCommon.inc}
end.


PS. 3 дюжины сервисов замучался бы отлаживать.
Успехов!
C уважением, Алексей.
------------------------------------------------
Хороших %s не бывает — бывает не худший вариант.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.