Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi StartService() Probleme (https://www.delphipraxis.net/2754-startservice-probleme.html)

Dani 5. Feb 2003 18:30


StartService() Probleme
 
Hooi hoi!

Es gibt eine Sache bei StartService() , die ich nicht ganz verstehe:


lpServiceArgVectors
[in] Pointer to an array of pointers to null-terminated strings to be passed to a service as arguments. Driver services do not receive these arguments. If no arguments are passed to the service, this parameter can be NULL. The service accesses these arguments through its ServiceMain function. The first argument (argv[0]) is the name of the service by default, followed by the arguments, if any, in the lpServiceArgVectors array.


Also ein Zeiger auf ein Array, das wiederum Zeiger auf nullterminierte Strings enthält, wobei der erste dieser Zeiger aber der Servicename sein muss?!

Wer ist für diese Form der Parameter-Übergabe verantwortlich? *grrr* :mrgreen:

Hab ichs wenigstens richtig verstanden?

Jedenfalls weiß ich nun nicht genau, was ich der Funktion nun schicken soll.

Vielleicht sowas?

Code:
var ParamsArray: array of Pchar;

{...}

StartService(SCHandle, Length(ParamsArray)-1, ^ParamsArray);
Was mich auch verwirrt, ist dieser Parameter:
dwNumServiceArgs

Specifies the number of argument strings in the lpServiceArgVectors array. If lpServiceArgVectors is NULL, this parameter can be zero.


Soll diese Nummer jetzt die Anzahl der tatsächlichen Parameter ohne Argument null, das ja "by default" der Name des Services ist, oder einfach die Länge des Arrays sein?

Gruß,
Dani

jbg 5. Feb 2003 18:45

Normalerweise brauchst du diese Parameter nicht:
Delphi-Quellcode:
var p: PChar;

p := nil;
if StartService(SCService, 0, p) then

Shir Khan 7. Jul 2004 14:37

Re: StartService() Probleme
 
Wenn ich solche Antworten schon höre!!!!!!!!!!
Gehen wir einfach mal davon aus er BRAUCHT DIESE PARAMETER!!!!!!!

Zumindest brauche ICH DIESE PARAMETER, aber leider Streuben diese sich und irgendwie bekomme ich die Übgabe nicht hin.

Hat also vielleicht jemand ein Beispiel parat, wie man dieses Parameter-Array, z.B. mit zwei Parametern, erzeugen kann und wie es dann übergeben wird??

PS: Bitte keinen Beitrag "das brauchst Du normalerweise nicht"... den ich brauche es....

Danke im Vorraus 8) 8)
GVT

w3seek 7. Jul 2004 16:26

Re: StartService() Probleme
 
Es wuerde in etwa so aussehen:

Delphi-Quellcode:
const
  PARAMETER_COUNT = 3;
var
  Parameters: array[0..PARAMETER_COUNT - 1] of PChar;
begin
  Parameters[0] := 'service.exe';
  Parameters[1] := 'Parameter 1';
  Parameters[2] := 'Parameter 2';
  StartService(SCHandle, Length(Parameters) - 1, @Parameters[0]);
end;
Leider kann ich es jetzt nicht auf die Schnelle testen.

Shir Khan 7. Jul 2004 16:43

Re: StartService() Probleme
 
*prust*

So hatte ichs auch schon versucht. Aber der letzte Parameter ist ein "var"-Parameter, dann würde Formal und Actualparameter nicht passen. Ich hab dann auch einfach eine PChar Variable eingebaut und @Parameters[0] so umgewandelt. Leider kommt in Service dann nur die Adresse des ersten Parameters an.. der zweite Parameter ist zufälliger Nonsens.

Wenn ich anstatt eines Array einfach nur einen PChar überheben z.B. PChar('Hallo'), wieder über eine Variable zwischengepuffert, dann kommt als erster Parameter tatsächlich 'Hallo' an. Der zweite Parameter ist wieder Nonsens (hab ich auch so erwartet). Diese Art der Parameterübergabe ist schlicht und einfach ein Verbrechen gegen die Menschlichket.

Ich suche schon Stundenlang im Netz und finde kein Beispiel für einen StartService mit Parametern..... bitte, einer muß das doch schon mal gemacht haben...

GVT

Phoenix 7. Jul 2004 16:47

Re: StartService() Probleme
 
Ich weiss nicht ob Dir das hilft, denn ich habe eine komplett eigene Service-Klasse geschrieben die direkt auf die API zugreift. Daher greife ich über einen ControlDispatcher auf den Service zu (und die ServiceMain - Funktion ist bei mir auch eine Methode).

Aber vielleicht hilft es ja doch.
Delphi-Quellcode:
var
   m_dispatcher: array[0..1] of TServiceTableEntry;
begin
   m_dispatcher[0].lpServiceName := PChar('ServiceName'); // hier der Name des Service
   m_dispatcher[0].lpServiceProc := @ServiceProcedure; // adresse zur ServiceMain-Funktion
   m_dispatcher[1].lpServiceName := nil;
   m_dispatcher[1].lpServiceProc := nil;

   StartServiceCtrlDispatcher(m_dispatcher[0]);
end;
Edit: Und nicht wundern, die beiden NIL - Einträge da braucht es wirklich. Weiss nicht warum, aber ohne die gehts nicht.

Shir Khan 7. Jul 2004 17:37

Re: StartService() Probleme
 
Nein, tut mir leid. Die Funktion StartService ist ja direkt eine API-Funktion.
Auch das schreiben von eigenen Service-Klassen hilft da glaube ich nicht, zudem habe ich auch nicht die Zeit dafür jetzt.

So langsam aber sicher treibt mich diese Funktion in den Wahnsinn. Ich habe bestimmt schon 200 verschiede Arten ausprobiert dieser Funktion ihr verblödetes Array zu übergeben, aber nichts funktioniert.

Weis den wirklich niemand wie man einem Service zwei Parameter übergeben kann??? Wenn wirklich keiner was weis, dann übergebe ich eben beide Parameter im ersten Parameter und parse sie dann selbst (obwohl das ja kein Zustand ist).

Christian Seehase 7. Jul 2004 17:48

Re: StartService() Probleme
 
Moin Shir Khan,

das Problem ist die Art, wie Borland die Funktion deklariert hat.

Wenn Du sie z.B. so importierst

Delphi-Quellcode:
function StartService(const hService : DWORD;const dwNumServiceArgs : DWORD;const lpServiceArgVectors : Pointer) : Longbool; stdcall; external 'advapi32.dll' name 'StartServiceA';
hat sich das Problem mit dem Var Parameter erledigt, und Du kannst, z.B., die Variante von w3seek verwenden.

w3seek 7. Jul 2004 19:41

Re: StartService() Probleme
 
ja, ich hatte fast vermutet dass Borland die funktion so deklariert hatte....typisch borland....

Shir Khan 8. Jul 2004 13:38

Re: StartService() Probleme
 
*prust*

Danke Leute. Auf die Idee die Funktion einfach selbst zu importieren hätte ich auch kommen können *g*. Aber mit der geposteten Variante hier funktioniert es nun einwandfrei.

Anzumerke wäre nur, daß man selbst nicht als ersten Parameter den Serivce-Namen angeben muß. Der Windows-Service-Managere sorgt dafür das der erste Paramater der Service-Name ist - und das ohne das man sich dagegen wehren kann *ggg*.

GVT


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:43 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz