@jaenicke,
ich hab das jetzt so gemacht, wie du es vorgeschlagen hast. Ich starte meine Anwendung ein zweites Mal mit ShellExecuteEx und wahlweise 2 Parametern (1x zum Starten und 1x zum Stoppen meines Dienstes).
Code:
function RunAs(const FileName, StartParam: string): Boolean;
var sefunc: TShellExecuteInfo;
begin
FillChar(sefunc, SizeOf(sefunc), 0);
sefunc.cbSize:= SizeOf(sefunc);
sefunc.Wnd:= 0;
sefunc.lpVerb:= PChar('runas');
sefunc.lpFile:= PChar(FileName);
sefunc.lpParameters:= PChar(StartParam);
sefunc.nShow:= SW_HIDE;
Result:= ShellExecuteEx(@sefunc);
end;
procedure TMainForm.DStartBtnClick(Sender: TObject);
begin
RunAs(Application.ExeName, ' /startts');
end;
In der Projektdatei frage ich ab, ob einer der beiden Paramter übergeben wurde. Wenn ja führe ich meine Admin-Funktionen aus und beende das Programm. Andernfalls fahre ich ganz normal mit dem Erzeugen der Formulare fort und lasse das Programm normal laufen.
Code:
StartProg := True;
if ParamCount > 0 then // Startparameter wurde übergeben
begin
if (LowerCase(ParamStr(1)) = '/startts') then // Dienst starten
begin
ServiceStart('','MyService');
StartProg := False; // Das normale Programm nicht ausführen
end
else if (LowerCase(ParamStr(1)) = '/stopts') then // Dienst stoppen
begin
ServiceStop('','MyService');
StartProg := False; // Das normale Programm nicht ausführen
end;
end;
if StartProg then
begin
Application.CreateForm(TMainForm, MainForm);
.
.
Application.Run;
end;
Das funktioniert soweit gut. Damit ist meine Frage beantwortet.
Vielen Dank an euch alle.
Ronny