na, so ganz doll war die Sache mit CreateProcess dann doch nicht, denn unter Vista (bei einem anderen Vista auch nicht) startet der Prozess im Hintergrund, was natürlich sehr unschön ist.
Wird unter demselben Vista der Prozess mit ShellExecute aufgerufen, erscheint er im Vordergrund und auch die
UAC poppt sauber auf. Also nehme ich zum Aufrufen der Deinstallation-Programme doch ShellExecute. Da muss dann doch der Dateiname vom Parameter getrennt werden, was mir aber jetzt dank himitsu sauber gelungen ist.
Ich habe es aber dann doch etwas anders gemacht und ganz so einfach war es auch nicht. Aber es funzt. Das ganze Programm habe ich angehängt. Der interessante Teil ist hier:
Delphi-Quellcode:
// Kommandozeile in Dateinamen und Parameter Splitten
procedure SplitFileAndParam(
const Commandline:
string;
var Filename,Param:
string);
const AnzSuffixe=3;
Suffixe:
array[1..AnzSuffixe]
of string=('
com','
exe','
bat');
var L,Pathes:TStringList;
i,j,k,p:integer;
FilenameConcat,FilenamePath,FilenameSuffix:
string;
Found:boolean;
begin
// Commandline an Leerzeichen splitten
L:=Split(CommandLine,'
',true,false);
// Pfadvariable auslesen und bei ; splitten
Pathes:=Split(GetEnvironmentVariable('
PATH'),'
;',true,false);
Pathes.Insert(0,'
');
// Dateiname Stueck fuer Stueck wieder zusammensetzen bis er existiert
Filename:='
';
Found:=false;
for i:=0
to L.Count-1
do if not Found
then begin
FilenameConcat:=RemoveQuotes(Trim(FilenameConcat+'
'+L[i]));
// Existiert die bis jetzt zusammengesetzte Datei?
if FileExists(FilenameConcat)
then begin
Found:=true;
Break;
end;
// mit vorgesetzten Pfaden aus Umgebungsvariablen probieren
if not Found
and (ExtractFileDrive(FilenameConcat)='
')
then begin
for j:=0
to Pathes.Count-1
do if not Found
then begin
FilenamePath:=AddBacklash(Trim(Pathes[j]))+FilenameConcat;
if FileExists(FilenamePath)
then begin
Found:=true;
Break;
end;
// Falls nicht, mit angefuegter Endung COM,EXE,BAT probieren
if not Found
and (ExtractFileExt(FilenamePath)='
')
then begin
for k:=1
to AnzSuffixe
do begin
FilenameSuffix:=FilenamePath+'
.'+Suffixe[k];
if FileExists(FilenameSuffix)
then begin
Found:=true;
Break;
end;
end;
end;
end;
end;
end;
if Found
then begin
p:=Pos(FilenameConcat,Commandline)+Length(FilenameConcat);
while (Copy(Commandline,p,1)<>'
')
and (p<Length(CommandLine))
do Inc(p);
Filename:=Trim(Copy(CommandLine,1,p));
Param:=Trim(Copy(CommandLine,p+1,Length(CommandLine)));
end else begin
Filename:='
';
Param:='
';
end;
end;