От: | glh | ||
Дата: | 11.08.06 14:01 | ||
Оценка: |
Y>А ктонибудь знает что нужно сделать, чтобы сервис можно было отлаживать как обыкновенный exe`шник, нажал F9 и всё прекрасно начинает проверяться!!!!!!!
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;
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},
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.