Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.06;
Скачать: CL | DM;

Вниз

Сервис   Найти похожие ветки 

 
Levin_610 ©   (2006-07-14 12:50) [0]

как зарегестрировать программу, как сервис?


 
sniknik ©   (2006-07-14 12:53) [1]

выполнить с параметром /install (если конечно она написана именно как сервис)


 
isasa ©   (2006-07-14 13:03) [2]

http://www.ishodniki.ru/art/artshow.php?id=90&cat=1&show=delphi

вот эта штука повторяется в нете n-раз.
Если сделать как там, то, по моему, параметр /i :)


 
Levin_610 ©   (2006-07-14 13:22) [3]

спасибо


 
prosto_Maria ©   (2006-07-14 16:09) [4]

там есть функция ServiceInitialization, что она делает и как её описать?


 
novill ©   (2006-07-14 16:22) [5]


> prosto_Maria ©   (14.07.06 16:09) [4]
> там есть функция ServiceInitialization

"Там" - Это где? :)


 
prosto_Maria ©   (2006-07-14 16:40) [6]

http://www.ishodniki.ru/art/artshow.php?id=90&cat=1&show=delphi


 
Пусик ©   (2006-07-14 22:23) [7]


> Levin_610 ©   (14.07.06 12:50) 


srvany.exe из пакета Resouce Kit. Позволит запустить программу как сервис.

http://www.microsoft.com/downloads/details.aspx?FamilyID=9d467a69-57ff-4ae7-96ee-b18c4790cffd&DisplayLang=en

либо ищи отдельно 3 файла:
instsrv.exe
srvany.exe
srvany.wri (инструкция).


 
Leonid Troyanovsky ©   (2006-07-14 22:41) [8]


> prosto_Maria ©   (14.07.06 16:40) [6]


Видишь ли, Маша (ничего, если я запросто?)
Для того, чтобы зарегистрировать прилож aka service,
она д.б. написана aka service. О чем уже ранее было и сказано.

Подробности можно найти на

http://rsdn.ru/?article/baseserv/svcadmin-1.xml & etc

--
Regards, LVT.


 
isasa ©   (2006-07-14 23:13) [9]

prosto_Maria ©   (14.07.06 16:09) [4]

там есть функция ServiceInitialization, что она делает и как её описать?


Очередной переписчик этой "библии" забыл ее закоментировать. Эта функция может быть написана(а может и нет) пользователем для инициализации каких-нибудь данных сервиса. Показывает место, где это уместно делать. В коментарий ее.


 
isasa ©   (2006-07-14 23:19) [10]

OFFTOP
Чистое любопытство. Зачем два ника?
Levin_610 ©
prosto_Maria ©

Да еще такие разные?


 
Leonid Troyanovsky ©   (2006-07-14 23:21) [11]


> isasa ©   (14.07.06 23:19) [10]

> Да еще такие разные?


Я могу предложить версии, если ты поделишься
основаниями для идентефикации.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2006-07-14 23:25) [12]


> Leonid Troyanovsky ©   (14.07.06 23:21) [11]

> Я могу предложить версии, если ты поделишься
> основаниями для идентефикации.


Так основания шиты белыми нитками,
то, делится версиями я не буду, sorry.

--
Regards, LVT.


 
Levin_610 ©   (2006-07-17 09:29) [13]

у меня почему-то не заходило, под моим ником, а просто_Мария полезный ник), я написал программу, как сервис, но как прописать, чтобы она регистрировалась?


 
Ketmar ©   (2006-07-17 10:25) [14]

попросить SCM зарегистрировать. %-)


 
Levin_610 ©   (2006-07-17 10:27) [15]

до этого я уже дошёл, я вроде прошу, но видимо как-то не так)


 
Fay ©   (2006-07-17 10:38) [16]

2 Levin_610 ©   (17.07.06 10:27) [15]
Значит не дошёл


 
Levin_610 ©   (2006-07-17 10:47) [17]

последнее высказывание было необходимо) - я делаю так:
hSCMgr := OpenSCManager(nil, nil, SC_MANAGER_CREATE_SERVICE);
 if (hSCMgr <> 0) then
 begin
   hNewService := CreateService(hSCMgr, PChar(ServiceName), PChar(ServiceName),
     STANDARD_RIGHTS_REQUIRED, SERVICE_WIN32_OWN_PROCESS,
     SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
     PChar(ExecutablePath), nil, nil, nil, nil, nil);
- это все, что нужно, чтобы SCM зарегистрировал службу? или нужно ещё что-то? Или может в этом коде есть ошибка?


 
isasa ©   (2006-07-17 10:54) [18]

Вот фрагмент болванки _tmain сервиса. На D, к сожалению нет, т.к. не юзаю.
Но идея, думаю, будет понятна. API функции -- те-же. Лежать должен в *.dpr, если не ошибаюсь.

TCHAR srvName[] = _T("DiSpy");
TCHAR srvDispName[] = _T("DiSpy Internet Broadband Router Spyer");
threadDataStruct thData;

int _tmain(int argc, _TCHAR* argv[])
{
...
  //Service Installing
    if(wcscmp(argv[1],L"/i")==0)
    {
       wprintf(L"Service installing ...\n");
       SC_HANDLE schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);  // Open SC Manager
       if (NULL == schSCManager)
       {
        LPVOID lpMsgBuf;
        DWORD dw = GetLastError();
        FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
                        NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL );
        wprintf(L"OpenSCManager failed. (0x%08X)%s\n", dw, lpMsgBuf);
        LocalFree(lpMsgBuf);
        return 0;
       }
       SC_HANDLE schService = CreateService(schSCManager, srvName, srvDispName, SERVICE_ALL_ACCESS,    
                SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, thData.szPath,
                NULL, NULL, NULL, NULL, NULL);
       if (schService == NULL)
       {
           LPVOID lpMsgBuf;
           DWORD dw = GetLastError();
           FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
                 NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL );
         wprintf(L"CreateService failed. (0x%08X)%s\n", dw, lpMsgBuf);
         CloseServiceHandle(schSCManager);
         LocalFree(lpMsgBuf);
         return 0;
       }
       CloseServiceHandle(schService);
       wprintf(L"Service installing succeeded:\n");
       wprintf(L"Service display name: \"%s\"\n", srvDispName);
       wprintf(L"Service file path: \"%s\"\n", thData.szPath);
   return 0;
    }
    //Service Uninstalling
    if(wcscmp(argv[1],L"/u")==0)
    {
       wprintf(L"Service uninstalling ...\n");
       SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS); // Open SC Manager
       if (NULL == schSCManager)
       {
         LPVOID lpMsgBuf;
         DWORD dw = GetLastError();
         FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
                          NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL );
         wprintf(L"OpenSCManager failed. (0x%08X)%s\n", dw, lpMsgBuf);
         LocalFree(lpMsgBuf);
         return 0;
       }
       SC_HANDLE schService = OpenService( schSCManager, srvName, DELETE);
       if (schService == NULL)
       {
         LPVOID lpMsgBuf;
         DWORD dw = GetLastError();
         FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
            NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL );
         wprintf(L"OpenService failed. (0x%08X)%s\n", dw, lpMsgBuf);
         CloseServiceHandle(schSCManager);
         LocalFree(lpMsgBuf);
         return 0;
       }

       if (!DeleteService(schService))
       {
         LPVOID lpMsgBuf;
         DWORD dw = GetLastError();
         FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
     NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL );
         wprintf(L"DeleteService failed. (0x%08X)%s\n", dw, lpMsgBuf);
         CloseServiceHandle(schSCManager);
         CloseServiceHandle(schService);
         LocalFree(lpMsgBuf);
         return 0;
       }

       wprintf(L"DeleteService succeeded.\n");
       wprintf(L"Service was deleted without error.\n");

       CloseServiceHandle(schSCManager);
       CloseServiceHandle(schService);
       return 0;
     }
...


 
Fay ©   (2006-07-17 11:08) [19]

2 Levin_610 ©   (17.07.06 10:47) 17]
> STANDARD_RIGHTS_REQUIRED
SC_MANAGER_CREATE_SERVICE не лучше? И ваще, где анализ результата выполнения CreateService?


 
Levin_610 ©   (2006-07-17 11:23) [20]

вроде та часть программы у меня написана так же, значит проблема не в этом


 
Levin_610 ©   (2006-07-17 11:27) [21]

всё есть - CreateServise


 
Levin_610 ©   (2006-07-17 11:34) [22]

а что нужнопрописать в основной ф-ции function MainServiceThread(p: Pointer): DWORD; stdcall;
 var hWinSta, hDesktop, hOldWinSta, hOldDesktop: THandle;
begin
 sleep(10);
end;
ещё что-то?


 
Fay ©   (2006-07-17 12:00) [23]

2 Levin_610 ©   (17.07.06 11:34) [22]
>  что нужнопрописать в основной ф-ции
Предполагается, что ты это уже знаешь.
Не парь мозги, возьми готовый класс службы.


 
Levin_610 ©   (2006-07-17 12:05) [24]

ссылку на какой-нибудь нормальный готовый класс можешь дать?


 
Levin_610 ©   (2006-07-17 12:23) [25]

пожалуйста


 
isasa ©   (2006-07-17 12:31) [26]

:)
Если по-простому, то

while exitFlag=0 do begin
 <делаем что-то>
 Sleep(<скоко надо, если надо>);
end;

Или, если хочешь с ним общаться через WM_<message>, то GetMessage в цикле.


 
isasa ©   (2006-07-17 12:33) [27]

Судя по вопросам, все-таки, сходи по ссылке
Leonid Troyanovsky ©   (14.07.06 22:41) [8]
на rsdn.
Наступит просветление. :)


 
Levin_610 ©   (2006-07-17 12:52) [28]

я прочиталЮ и вроде бы всё нормально в моей программе - надо было идти в футболисты)


 
Fay ©   (2006-07-17 14:40) [29]

2 Levin_610 ©   (17.07.06 12:52) [28]
Что возвращает CreateService?


 
Пусик ©   (2006-07-17 14:48) [30]


> Levin_610 ©   (17.07.06 12:05) [24]
> ссылку на какой-нибудь нормальный готовый класс можешь дать?
>


Вот рабочий код.

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
 ExtCtrls;

type

 TThreadTimer=class(TThread)
 protected
   FS: TFileStream;
   procedure Execute; override;
 end;

 TTwoService = class(TService)
   procedure ServiceExecute(Sender: TService);
   procedure ServiceStart(Sender: TService; var Started: Boolean);
   procedure ServiceStop(Sender: TService; var Stopped: Boolean);
   procedure ServiceContinue(Sender: TService; var Continued: Boolean);
   procedure ServicePause(Sender: TService; var Paused: Boolean);
 private
   { Private declarations }
 public
   function GetServiceController: TServiceController; override;
   { Public declarations }
 end;

var
 TwoService: TTwoService;
 ThrTimer: TThreadTimer;

implementation

{$R *.DFM}

{TTwoService}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
 TwoService.Controller(CtrlCode);
end;

function TTwoService.GetServiceController: TServiceController;
begin
 Result := ServiceController;
end;

procedure TTwoService.ServiceExecute(Sender: TService);
begin
   while not terminated do
   begin
     ServiceThread.ProcessRequests(True);
   end;
end;

procedure TTwoService.ServiceStart(Sender: TService; var Started: Boolean);
begin
 ThrTimer := TThreadTimer.Create(True);
 ThrTimer.FreeOnTerminate := True;
 try
   if not FileExists("c:\log.tmp") then
   begin
     ThrTimer.FS := TFileStream.Create("c:\log.tmp",fmCreate or fmShareDenyWrite);
     ThrTimer.FS.Free;
   end;
   ThrTimer.FS := TFileStream.Create("c:\log.tmp",fmOpenReadWrite or fmShareDenyWrite);

   Started := True;
 except
   ThrTimer.Terminate;
   Started := False;
 end;
 ThrTimer.Resume;
end;

procedure TTwoService.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
 ThrTimer.Terminate;
 ThrTimer.Resume;
 Stopped := True;
end;

procedure TTwoService.ServiceContinue(Sender: TService;
 var Continued: Boolean);
begin
 ThrTimer.Resume;
 Continued := True;
end;

procedure TTwoService.ServicePause(Sender: TService; var Paused: Boolean);
begin
ThrTimer.Suspend;
Paused := True;
end;

{ TThreadTimer }

procedure TThreadTimer.Execute;
var
 s: String;
begin
 while not Terminated do
 begin
   try
     s := FormatDateTime("hh:nn:ss",Now)+#13#10;
     FS.Write(s[1],Length(s));
     Sleep(1000);
   except
   end;
 end;
 FS.Free;
end;

end.


 
Fay ©   (2006-07-17 14:54) [31]

2 Пусик ©   (17.07.06 14:48) [30]
if not FileExists("c:\log.tmp") then
  begin
    ThrTimer.FS := TFileStream.Create("c:\log.tmp",fmCreate or fmShareDenyWrite);
    ThrTimer.FS.Free;
  end;
  ThrTimer.FS := TFileStream.Create("c:\log.tmp",fmOpenReadWrite or fmShareDenyWrite);


что это за порнография?


 
Пусик ©   (2006-07-17 15:12) [32]


> Fay ©   (17.07.06 14:54) [31]
> 2 Пусик ©   (17.07.06 14:48) [30]if not FileExists("c:\log.
> tmp") then   begin     ThrTimer.FS := TFileStream.Create("c:
> \log.tmp",fmCreate or fmShareDenyWrite);     ThrTimer.FS.
> Free;   end;   ThrTimer.FS := TFileStream.Create("c:\log.
> tmp",fmOpenReadWrite or fmShareDenyWrite);что это за порнография?
>


Внимательней код изучай.


 
DrPass ©   (2006-07-17 15:14) [33]

А почему не
if not FileExists("c:\log.tmp") then
   ThrTimer.FS := TFileStream.Create("c:\log.tmp",fmCreate or fmShareDenyWrite)
else
 ThrTimer.FS := TFileStream.Create("c:\log.tmp",fmOpenReadWrite or fmShareDenyWrite);
?


 
Fay ©   (2006-07-17 15:18) [34]

2 Пусик ©   (17.07.06 15:12) [32]
> Внимательней код изучай.
Я изучил. Порнография в чистом виде.


 
Пусик ©   (2006-07-17 15:29) [35]


> Fay ©   (17.07.06 15:18) [34]
> 2 Пусик ©   (17.07.06 15:12) [32]> Внимательней код изучай.
> Я изучил. Порнография в чистом виде


Вот иди и займись ей(порнографией).


> DrPass ©   (17.07.06 15:14) [33]


Дело в том, что при TFileStream.Create("c:\log.tmp",fmCreate or fmShareDenyWrite) нужный эффект(доступ на чтение из других программ) не будет достигнут.


 
Пусик ©   (2006-07-17 15:31) [36]

> DrPass ©   (17.07.06 15:14) [33]

Да и не в том вопрос. Приведен рабочий пример. Как и просил человек.
А все вокруг - излишне.


 
Игорь Шевченко ©   (2006-07-17 17:10) [37]

Порнография на самом деле находится в SysUtils, не позволяющая передать в функцию FileCreate параметр режима разделения доступа.


 
Fay ©   (2006-07-17 17:13) [38]

2 Пусик ©   (17.07.06 15:29) [35]
> Дело в том, что при TFileStream.Create
А CreateFile не судьба?


 
Пусик ©   (2006-07-17 17:14) [39]


> Fay ©   (17.07.06 17:13) [38]
> 2 Пусик ©   (17.07.06 15:29) [35]> Дело в том, что при TFileStream.
> CreateА CreateFile не судьба?


А прежде подумать, а потом говорить, тоже не судьба?


 
Игорь Шевченко ©   (2006-07-17 17:20) [40]


> ThrTimer.FS := TFileStream.Create("c:\log.tmp",fmCreate
> or fmShareDenyWrite);


or fmShareDenyWrite - лишнее. fmCreate равен $FFFF



Страницы: 1 2 вся ветка

Текущий архив: 2006.08.06;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.05 c
3-1149057311
Kolmax
2006-05-31 10:35
2006.08.06
Импорт данных


3-1148986218
Iehbr
2006-05-30 14:50
2006.08.06
Запрос на выборку из дву таблиц


2-1153373615
TimTimon
2006-07-20 09:33
2006.08.06
Форма


2-1152790137
novill
2006-07-13 15:28
2006.08.06
Какой тип лучше использовать для небольших строк?


2-1152602497
Квэнди
2006-07-11 11:21
2006.08.06
ПРоблема с Gettext совместно с своим Winproc