![]() |
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:
Was mich auch verwirrt, ist dieser Parameter:
var ParamsArray: array of Pchar;
{...} StartService(SCHandle, Length(ParamsArray)-1, ^ParamsArray); 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 |
Normalerweise brauchst du diese Parameter nicht:
Delphi-Quellcode:
var p: PChar;
p := nil; if StartService(SCService, 0, p) then |
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 |
Re: StartService() Probleme
Es wuerde in etwa so aussehen:
Delphi-Quellcode:
Leider kann ich es jetzt nicht auf die Schnelle testen.
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; |
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 |
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:
Edit: Und nicht wundern, die beiden NIL - Einträge da braucht es wirklich. Weiss nicht warum, aber ohne die gehts nicht.
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; |
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). |
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:
hat sich das Problem mit dem Var Parameter erledigt, und Du kannst, z.B., die Variante von w3seek verwenden.
function StartService(const hService : DWORD;const dwNumServiceArgs : DWORD;const lpServiceArgVectors : Pointer) : Longbool; stdcall; external 'advapi32.dll' name 'StartServiceA';
|
Re: StartService() Probleme
ja, ich hatte fast vermutet dass Borland die funktion so deklariert hatte....typisch borland....
|
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 |
Re: StartService() Probleme
Moin Shir Khan,
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:58 Uhr. |
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