[DELPHI] TService

Pagina: 1
Acties:

  • MidnightMotion
  • Registratie: April 2002
  • Laatst online: 03-04-2022
Ik heb een service gemaakt en dat werkt allemaal goed maar ik heb toch nog een paar vragen:

1. Ik zou graag een icoon in de taskbar laten zien als de service gestart is, dit lukt echter alleen als de service gestart wordt nadat er is ingelogd (de taskbar is er immers nog niet voor dit tijd) Over het algemeen zal de service echter met windows gestart worden. Hoe kan ik dan toch een icoon op de taskbar plaatsen?

2. De CPU usage staat altijd op 100% als de service loopt (en nog niets doet) dit komt waarschijnlijk omdat binnen de service een thread loopt. Ik heb op de OnExecute niets uitgeprogrammeerd, de Thread gaat lopen op het moment dat ik een message verstuur naar de service. Wat kan ik doen om de CPU usage weer te laten kloppen?

Eigenaar van domoticavergelijken.info


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Loopt er een lus in die thread?
Zoja, zet dan in die lus een sleep(), zodat Windows ook tijd heeft om de messages van andere app's en users af te handelen.

https://fgheysels.github.io/


  • Beowulf27
  • Registratie: September 2003
  • Laatst online: 11-09-2024
whoami schreef op 01 October 2003 @ 10:51:
Zoja, zet dan in die lus een sleep()
Volgens mij moet je de ProcessMessages (ook) aanroepen als je in een thread niets doet.

Working @ http://www.tricode.nl


  • MidnightMotion
  • Registratie: April 2002
  • Laatst online: 03-04-2022
ProcessMessages had ik al geprobeerd, zonder succes. Ik heb er nu een Sleep(1) tussen gezet en dit werkt inderdaad, bedankt! Nu alleen vraag 1 nog...

Eigenaar van domoticavergelijken.info


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Ik ken het TService component niet echt, maar heb je daar geen OnStart event ofzo?

https://fgheysels.github.io/


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

1. Ik zou graag een icoon in de taskbar laten zien als de service gestart is, dit lukt echter alleen als de service gestart wordt nadat er is ingelogd (de taskbar is er immers nog niet voor dit tijd) Over het algemeen zal de service echter met windows gestart worden. Hoe kan ik dan toch een icoon op de taskbar plaatsen?
Je kunt (en MOET!!!) een message afvangen die het systeem broadcast als de taskbar gecreeerd wordt. Deze moet iedere app afvangen zodat ie z'n icoon kan herbouwen als explorer.exe wordt geherstart, iets wat bijna geen enkele app al doet, maar jij moet 'm dus zeker afvangen als service. De ID van deze message is niet fixed, maar wordt bij de startup van Windows gedefinieerd, en kun je via RegisterWindowMessage(naampje) opzoeken.

Welk naampje dat is staat ergens in MSDN onder Shell Programming :)

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

whoami schreef op 01 October 2003 @ 11:02:
Ik ken het TService component niet echt, maar heb je daar geen OnStart event ofzo?
Tuurlijk, maar bij Windows startup vind die plaats voordat er iemand inlogt (dat is juist het hele idee achter services).

Professionele website nodig?


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Wat betreft vraag 1: ik ben (op google groups?) een keer een topic tegengekomen over hoe je je taakbalk icoon terug kon toveren nadat explorer.exe gecrashed (en dus opnieuw gestart) was. Misschien is het een idee om daar eens op te zoeken...?

Zal zelf ook ff kijken of ik dat topic nog kan vinden

Edit:
Volgens mij is het dat wat Curry684 zegt... :p

[ Voor 10% gewijzigd door OZ-Gump op 01-10-2003 11:07 ]

My personal website


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
curry684 schreef op 01 oktober 2003 @ 11:06:
[...]

Tuurlijk, maar bij Windows startup vind die plaats voordat er iemand inlogt (dat is juist het hele idee achter services).
Hmmm. Idd. :o

Moet je dan zelf nog ergens een event-handler definieren die getriggerd wordt als die message uitgezonden wordt, of hoe doe je dat dan?

https://fgheysels.github.io/


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Je kunt een message window creeren die alleen op die message reageert. De link op MSDN is overigens deze, en I quote:
Taskbar Creation Notification
With Internet Explorer 4.0 and later, the Shell notifies applications that the taskbar has been created. When the taskbar is created, it registers a message with the TaskbarCreated string and then broadcasts this message to all top-level windows. When your taskbar application receives this message, it should assume that any taskbar icons it added have been removed and add them again. This feature generally applies only to services that are already running when the Shell begins execution. The following example shows a very simplified method for handling this case.
Bijbehorende example van de messageloop voor je message window:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMessage, WPARAM wParam, 
                         LPARAM lParam)
{
    static UINT s_uTaskbarRestart;

    switch(uMessage)
    {
        case WM_CREATE:
            s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));
            break;
        
        default:
            if(uMessage == s_uTaskbarRestart)
                AddTaskbarIcons();
            break;
    }

    return DefWindowProc(hWnd, uMessage, wParam, lParam);
}

Professionele website nodig?


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Alleen is het de vraag of je met je Service die messages kan afvangen. Je Service is namelijk onderdeel van een andere 'Desktop' als je ingelogde gebruiker. Bovendien kunnen er in XP of via Terminal Server meerdere gebruikers tegelijk ingelogd zijn met meerdere taskbars. Het is allemaal nog zo simpel niet :) en ook ik heb geen kant en klaar antwoord voor je klaar. Je moet m iig 'Interactive' maken.

Er is een 3rd party leverancier die een uitgebreidere implementatie van TService gemaakt heeft. Die kan je misschien beter helpen: http://www.aldyn-software.com/svcom.html

/edit
Wat een gemakkelijkere en misschien ook nog wel interresantere oplossing is, is om een los programma (met taskbar icon) te maken die de service managed. De communicatie tussen die twee verloopt bijvoorbeeld dmv tcp/ip. Zo kan je je service ook nog op afstand managen.

[ Voor 22% gewijzigd door LordLarry op 01-10-2003 12:15 ]

We adore chaos because we like to restore order - M.C. Escher


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

LordLarry schreef op 01 October 2003 @ 12:10:
Alleen is het de vraag of je met je Service die messages kan afvangen. Je Service is namelijk onderdeel van een andere 'Desktop' als je ingelogde gebruiker. Bovendien kunnen er in XP of via Terminal Server meerdere gebruikers tegelijk ingelogd zijn met meerdere taskbars.
Er staat dan ook broadcast in die documentatie :P Daarnaast geeft MS zelf expliciet aan dat dit voor services de correcte methode is, en ik mag toch hopen dat ze verstand van hun eigen zaken hebben daar in Redmond :)

Professionele website nodig?


  • martijn_brinkers
  • Registratie: November 2001
  • Laatst online: 31-10-2025
Wat een gemakkelijkere en misschien ook nog wel interresantere oplossing is, is om een los programma (met taskbar icon) te maken die de service managed. De communicatie tussen die twee verloopt bijvoorbeeld dmv tcp/ip. Zo kan je je service ook nog op afstand managen.
Dat is zowiezo aan te raden. Een service draait vaak onder het systeem account. Het is daarom aan te raden je code in een service zo basic mogelijk te houden om de kans op exploits te verkleinen. Een interactive service beschikt over een message queue waardoor er exploits zoals de volgende zijn te gebruiken

http://www.microsoft.com/...ity/bulletin/MS02-071.asp

Zowiezo bevat Delphi (in iedergeval t/m D6) een bug waardoor een interactive services niet goed werkt.

zie:

http://groups.google.com/...85_2%2540dnews%26rnum%3D4


Advies van Microsoft

http://support.microsoft....8/7/21.ASP&NoWebContent=1
Implementing a user interface within a service process is not recommended. Whenever possible, a service process should be shielded from the actions of an interactive user. If a service needs to receive input or display output to the interactive user, a separate process should be implemented to run within the same logon session as the interactive user. That process can communicate with the service through the standard Win32 methods of interprocess communication.

[ Voor 23% gewijzigd door martijn_brinkers op 01-10-2003 21:41 ]


  • MidnightMotion
  • Registratie: April 2002
  • Laatst online: 03-04-2022
Oke, het werkt! (Had niet verwacht dat het zo simpel zou zijn... :) )

Allemaal bedankt voor de reakties :)

ps. Mijn service heeft trouwens geen eigen UI (Het wordt aangestuurd via messages vanuit het hoofdprogramma) dus zal geen last hebben van de bug in NT neem ik aan

Eigenaar van domoticavergelijken.info


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

En hoe heb je het nu aan het werk gekregen? Je stuur nu windows messages van een applicatie naar een service? En dat onder NT/2000/XP?

We adore chaos because we like to restore order - M.C. Escher

Pagina: 1