Toon posts:

[win32 API] Message naar service sturen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben (in Delphi, maar dat doet er eigenlijk niet zo toe) een serviceje aan het maken die messages van een dll moet ontvangen en daar vervolgens iets mee moet doen. Ik had dit geheel aan de gang in de vorm van een applicatie, maar nu ik er een service van probeer te maken loop ik tegen het probleem aan dat SendMessage als eerste parameter een handle naar de applicatie verwacht, maar een service heeft niet zo'n handle. Hoe kan ik toch messages naar een service sturen?

  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 16-09 21:19

Delphi32

Heading for the gates of Eden

Ben zelf net met die messages aan het klooien, da's toevallig...
SendMessage wil een Window Handle en die heb je in een service niet (althans niet zomaar).
Mogelijke paden om te onderzoeken die ik zo zie:
1. je service een window laten faken door een window handle aan te maken. Dan moet je nog wel uitvinden hoe die dll er dan achter komt wat de window handle van je service is.
2. Met PostThreadMessage werken. Citaatje uit de win32 sdk:
code:
1
The PostThreadMessage function places (posts) a message in the message queue of the specified thread and then returns without waiting for the thread to process the message.

De vraag is of je met asynchrone messaging tevreden bent.

Ik hoop dat ik je wat op gang heb kunnen brengen en ik ben benieuwd naar je resultaat, ik ben op zoek naar iets vergelijkbaars :)

Verwijderd

3. Gebruik maken van een named pipe om de communicatie met je service te doen.
4. Gebruik maken van SERVICE_USER_DEFINED_CONTROL en ControlService calls.

Methode 3 en 4 zijn de meest gangbare methoden om te communiceren met een service. Let er wel op als je een service maakt die gebruik maakt van een van deze methoden dat je niet klakkeloos alle invoer accepteert... andere processen kunnen immers ook via die communicatiekanalen communiceren met je service.
je service een window laten faken door een window handle aan te maken
Dat werkt wel... maar er zit een grote maar aan. Je mag over het algemeen geen messages sturen naar windows van een andere gebruiker. Een service draait als gebruiker 'system', en zou dan best wel eens niet je message kunnen ontvangen. Dit kan je dan weer oplossen door 'interact with desktop' aan te zetten voor je service, maar dat werkt dan weer niet op een terminal server. (naja... werkt wel, maar alleen op de console)

Er is nog een 5e manier, maar die kan ik je echt afraden, en dat is gebruik te maken van een shared memory segment om de communicatie te doen. Heeft wel als voordeel dat je 100% controle hebt over wat er nou gebeurt, maar als nadeel dat je meestal uitkomt op iets met polling... en da's lelijk!

Verwijderd

Topicstarter
Bedankt voor de info, weer wat geleerd.
Vooral methode 3 en 1 klinken me goed in de oren.
Methode 1 is lekker eenvoudig, maar een beetje lelijk en met methode 3 kun je mooie duidelijke code maken. (Methode 3 heeft iets weg van MPI, voor diegenen die dat wat zegt)

Het punt is nu alleen dat ik heb besloten dat het feit dat een service alleen door een gebruiker met admin rechten kan worden geïnstaleerd toch een te groot probleem is. Het voordeel dat een service al draait als er nog geen gebruiker is ingelogd is leuk, maar dat probleem niet waard.

In ieder geval bedankt voor jullie suggesties, ik heb er vast wat aan als ik een keer wel een service ga maken.

Verwijderd

6. Com , ranzig om aan de praat te krijgen maar als het eenmaal werkt is het best ok :Y)