Programarea serviciilor de ferestre pe delphi

Programarea serviciilor Windows pe Delphi

Dragi experți!
Spune-mi, dacă cineva a făcut-o:
1. În cazul în care să se uite
programarea serviciilor Windows pe Delphi cu exemple?






Poți să ai un exemplu?
2. Există o cerere cu un formular. Cum de a face un serviciu din ea?

Cu recunoștință # xA0; # xA0; # xA0; Leonid Fedkov.


> aplicație cu un formular. Cum de a face un serviciu din ea?

Îndepărtarea aceleiași aplicații GUI în serviciul GUI nu este doar nedorită, dar deseori imposibilă.

Iată un exemplu. File-> New-> Other-> Application service

utilizări
# xA0; Windows, Mesaje, SysUtils, Clase, Grafică, Controale, SvcMgr, Dialoguri;

tip
# xA0; TService1 = clasă (TService)
# xA0; # xA0; procedura ServiceExecute (Expeditor: TService);
# xA0; privat
# xA0; # xA0;
# xA0; public
# xA0; # xA0; funcția GetServiceController: TServiceController; suprascrie;
# xA0; # xA0;
# xA0; sfârșitul;

var
# xA0; Service1: TService1;

procedura de serviceController (CtrlCode: DWord); stdcall;
începe
# xA0; Service1.Controller (CtrlCode);
se încheie;

funcția TService1.GetServiceController: TServiceController;
începe
# xA0; Rezultat: = ServiceController;
se încheie;


procedura TService1.ServiceExecute (Expeditor: TService);
începe
# xA0; # xA0; în timp ce nu este Self.Terminated nu
# xA0; # xA0; # xA0; începeți
# xA0; # xA0; # xA0; # xA0; ServiceThread.ProcessRequests (False);
# xA0; # xA0; # xA0; # xA0;
# xA0; # xA0; # xA0; # xA0; sfârșitul;
# xA0; # xA0; # xA0; sfârșitul;
se încheie;

> câștiga mesaje

Dar ce zici cu un efort minim pentru schimbul de mesaje cu aplicația de serviciu? Nu m-am gândit la nimic mai bine decât să creez o fereastră invizibilă și să-i trimit mesaje.

Nu este nevoie de ferestre.
Mesajul m.b. nu numai fereastra a fost trimisă, ci și firele.
Vedeți mesajul PostThreadMessage ().
Singura limitare este asincronia funcției menționate mai sus.


> Nu este nevoie de ferestre.
> Mesaj mb. nu numai fereastra a fost trimisă, ci și firele.
> Vedeți PostThreadMessage ().
> Singura limitare este asincronia celor de mai sus
> f-tion.

În teorie, știu asta, dar în practică. Cum să primiți un mâner al fluxului de servicii? Cum introduc un răspuns la un eveniment personalizat în manualul de mesaje al firului? Nu este vorba despre "serviciul de la zero", ci despre aplicația serviciului de service.


> Singura limitare este asincronia celor de mai sus
> f-tion.

Un pic nu a înțeles. Funcția ferestrei este sincronă?








> Cum să primim un mâner al fluxului de servicii?

Pentru a trimite un mesaj de thread, nu aveți nevoie de un mâner, ci un ID de thread.

Un fir de serviciu își poate scrie ID-ul, de exemplu, în MMF.


> Ca și în manualul de mesaje de thread, introduceți un răspuns către utilizator
> eveniment?

Ciclul trebuie să fie organizat aproximativ în felul acesta (opțional):

în timp ce nu terminat nu începe
# xA0; WaitMessage;
# xA0; dacă PeekMessage (Msg, -1, TM_FIRST_MSG, TM_TM_LAST_MSG, PM_REMOVE) atunci
# xA0; # xA0; Expediere (Msg.Message)
# xA0; altceva
# xA0; # xA0; ProcessRequests (False);
se încheie;


> funcția ferestrei - sincronă?

Nu este o funcție de fereastră, ci o funcție SendMessage ().
Acesta returnează controlul după procesarea ferestrei țintă a mesajului trimis, iar PostThreadMessage () trimite un mesaj și readuce imediat controlul.

Este interesant, de ce atât de puternic ignorați prizele cu care este foarte convenabil să implementați aceeași comunicare? plus - dacă doriți - administrare la distanță chiar și de la serviciu?

> Fișierul de serviciu își poate scrie ID-ul, de exemplu, în MMF.

Deci Un MMF - asta este?


> Buclele ar trebui să fie organizate aproximativ în felul acesta

Acest lucru este de înțeles. Dar cum să ajungeți la aceasta în aplicația de servicii?


> Nu este o funcție de fereastră, ci o funcție SendMessage ().

Am înțeles. Nu mi-am dat seama imediat ce se referă la sincronitate.

Fișier mapat cu memorie

a se vedea CreateFilemapping () + MapViewOfFile ()


> Cum ajung la aplicația de servicii?

O bucla similară ar trebui să apară în modulul handler TService.OnExecute

Dacă nu aveți nevoie de interacțiune la distanță cu serviciul, atunci prizele sunt greu justificate.

Și, dacă este necesar, subiectul omogene set.oper.sredy utilizare NamedPipes rezonabile. Iar în conducta eterogenă poate fi, de asemenea juzat - * nix-sisteme de tehnologie de țeavă de sprijin.

> Fișier mapat în memorie

Este clar. Nu am întâlnit o abreviere. Numai aici MMF în acest caz. Nu este un tun pe vrăbii?


> O bucla similară ar trebui să apară în mânerul TService.OnExecute

Da. O să încerc, mulțumesc.


> FPM în acest caz. Nu este un tun pe vrăbii?

Poate că da.
Dar în implementarea software-ului este mai ușor decât alte moduri de a "publica" acest tip de informații.

Iată o altă versiune de "publicare". setați fereastra principală pentru aplicația de serviciu (a se vedea SetProp), care este un șir cu o reprezentare text a ID-ului firului de serviciu. Apoi orice proces din același desktop poate găsi fereastra de interes pentru a citi acest sv-in (GetProp). Dar acest lucru este justificat numai atunci când aplicația de serviciu implementează un singur serviciu și nu o mulțime de servicii (ceea ce este destul de normal).

Mi-ar recomanda foarte mult pentru comunicarea interproceselor să nu utilizeze mecanismul de câștig-mesaje, dar numit conducte.


> pentru aceleași prize ale mașinii, rețeaua nu se trage

Țevile nu trag. Dar nu petreceti timp pe munca nu este cel mai rapid protocol de transport bazat pe IP

> este mai bine să faceți mai multe opțiuni deloc

Este mai bine să faceți una.

> Regula conductei. 0)

În timp ce nu se dovedește că programul și pe Windows 98 ar trebui să funcționeze. - (

> o astfel de interacțiune a clientului și a serverului prin conducte, și aici
> - bam! - se pare că sub 98 nu merge.

Duc, ar trebui să-l duci printr-o conductă fără nume.

> Deci, ar fi necesar să-l ducem printr-o țeava fără nume.

Ei bine, atunci. Dacă încă mai am o astfel de oportunitate, o să știu. -)

Win9x nu implementează doar mecanismul server-side, iar clienții acolo funcționează destul de bine.

Știu. Dar a fost necesar ca clientul și serverul să funcționeze ca pe o singură mașină și pe altul. Pe scurt, vorbesc despre cazul meu specific, nu despre "conductele în general". ;-)







Articole similare

Trimiteți-le prietenilor: