![]() |
Re: Programmstart durch Autostart - kann man das herausfinde
Vielleicht lässt Du Dir mal den genauen ShellExecute-Aufruf anzeigen, zB:
Delphi-Quellcode:
Sag mir doch mal, was jeweils bei den Aufrufen von den Programmen wo es nicht klappt, angezeigt wird.
ShowMessage(name);
ShowMessage(workdir); //Edit: Was ist eigentlich mit den Parametern? Die Programme werden doch bestimmt im Autostart mit irgendwelchen Parametern gestartet, die hast Du aber in deinem Code von Beitrag #13 nicht berücksichtigt. Lass Dir die Parameter dann auch mal per ShowMessage anzeigen. |
Re: Programmstart durch Autostart - kann man das herausfinde
OK.
Was ich jetzt gemacht habe: Ich habe das Extrahieren des Parameters wieder eingefügt (bei String ohne Anführungsstrichen wird nach dem letzten Leerzeichen abgeschnitten, das danach ist dann der Parameter) Ich habe mir alle 3 Sachen (Dateiname, Parameter und Workdir) per ShoeMessage anzeigen lassen und siehe da! MSN 2 klappt schon mal, genau so wie MSn Plus 3! Aber MSN 7.5 und ICQ wehren sich immer noch und jetzt klappt der Autostart meines Sounkartenmixers nicht mehr :wall: Bei meinem Soundkartenmixer ist nämlich der spezielle Fall, dass der Pfad dorthin ein Leerzeichen drin hat und sonst kein Parameter angefügt ist. Also ist es auch nicht genau das was ich suche! Hier nochmal der aktuelle Code:
Delphi-Quellcode:
procedure TForm3.buttonclick(Sender: TObject);
var button: TButton; param,name,workdir: string; pos1, pos2: integer; begin if Sender is TButton then begin name := programs[(Sender as TButton).tag]; if pos('"', name)>0 then begin pos1 := pos('"', name); pos2 := posex('"', name, 2); param := Copy(name, pos2+1, MaxInt); name := Copy(name, pos1, pos2); end else begin if rpos(' ', name)>0 then begin param := Copy(name, rpos(' ', name) + 1, MaxInt); name := Copy(name, 1, rpos(' ', name) - 1); end; name := '"' + name + '"'; end; workdir := GetShellFolder($0028); ShowMessage(name); ShowMessage(param); ShowMessage(workdir); ShellExecute(Handle, 'open', PChar(name), PChar(param), PChar(workdir), SW_ShowNormal); end; end; Flare |
Re: Programmstart durch Autostart - kann man das herausfinde
Was wird denn genau bei ShowMessage angezeigt, wenn es nicht funktioniert?
(also MSN 7.5 und ICQ und Sounkartenmixer) |
Re: Programmstart durch Autostart - kann man das herausfinde
Ich werde noch verrückt -.-
Messenger 7 klappt jetzt (wieso auch immer, ich habe nix geändert) Aber ICQ und Mixer klappen immer noch nicht. ICQ: "C:\Programme\ICQLite\ICQLite.exe" -trayboot C:\Dokumente und Einstellungen\Flare Mixer: "C:\Programme\NVidia" Corperation\NvMixer\NvMixerTray.exe C:\Dokumente und Einstellungen\Flare Also wenn jetzt immer eins mehr klappt bin ich zu frieden :mrgreen: Auch wenn ich dadurch immer noch nicht weiß warum es mal nicht und dann auf einmal doch klappt :wall: Das Ganze sollte doch schon zuverlässig sein. Flare |
Re: Programmstart durch Autostart - kann man das herausfinde
also das der Mixer nicht klappt liegt ja wohl auf der Hand:
das Programm: C:\Programme\NVidia und als Parameter: Corperation\NvMixer\NvMixerTray.exe hier darfst Du nicht an der Leertaste Programm und Parameter trennen. |
Re: Programmstart durch Autostart - kann man das herausfinde
Das ist mir schon klar, bloß wenn du mir mal meinen Code anguckst weißt du auch warum da getrennt wird :zwinker:
Mein Programm weiß doch nicht, dass das Programm keinen Parameter hinten dran hat und denkt, da es keine Anführungsstriche aber ein Leerzeichen hat, dass dort der Parameter anfängt. (Die Anführungsstriche die du da sehen kannst wurden nach dem Trennen eingefügt) Deswegen hatte ich ja auch schon mal die Frage reingeworfen wie man am Besten den Parameter extrahieren kann. Flare |
Re: Programmstart durch Autostart - kann man das herausfinde
Kennst Du die Funktion
![]() Vielleicht überprüfst Du, bevor Du Parameter und Dateiname an der Leertaste trennst, ob die Datei vorhanden ist... Übrigens bei meinem AutostartManager habe ich eine ziemlich komplizierte Funktion, um die Datei zu finden. Dabei werden auch die Pfade in der Umgebungsvariable Path berücksichtigt. Vielleicht poste ich mal den Code... |
Re: Programmstart durch Autostart - kann man das herausfinde
Wenn ein Programm per Autostart gestartet wird, dann ist der Parent Task "explorer.exe". Wenn es dein Programm startet, dann ist der Parent logischerweise nicht mehr "explorer.exe". Liegts vielleicht daran?
|
Re: Programmstart durch Autostart - kann man das herausfinde
Also ob es am Explorer.exe liegt kann ich schlecht sagen ^^°
Und natürlich kenne ich FileExists. Aber selbst wenn ich das jetzt einbaue und damit dann den Mixer zum laufen bekomme, dann funzt das ICQ immer noch nicht. Ich kann natürlich an dieser Stelle einfach das automatisierende Element in meinem Programm weglassen und einen Hinweis ausgeben, dass man den Parameter entfernen soll, denn dann klappts ja. Ich denke mal so werde ich es jetzt mahen und melde mich nochmal wenn es danach immer noch (oder schon wieder) Probleme gibt. Flare |
Re: Programmstart durch Autostart - kann man das herausfinde
So hab jetzt deinen Code etwas umgebaut und mit den entsprechenden Teilen aus meinem Code ergänzt:
Delphi-Quellcode:
procedure TForm3.buttonclick(Sender: TObject);
function FindExecute(const Command: String): String; function GetWinPath(const Path: String): String; begin Result := StringReplace(StringReplace(StringReplace(StringReplace(Trim(StringReplace(Path, 'file:///', '', [rfIgnoreCase])), '\', PathDelim, [rfReplaceAll]), '/', PathDelim, [rfReplaceAll]), PathDelim+PathDelim, PathDelim, [rfReplaceAll]), '%20', ' ', [rfReplaceAll]); end; function ExpandEnvironmentPath(const Path: String): String; begin SetLength(Result, ExpandEnvironmentStrings(PChar(Path), nil, 0)); ExpandEnvironmentStrings(PChar(Path), PChar(Result), Length(Result)); Result := PChar(Result); end; var i, j: Integer; Path, PathExt: TStrings; begin Result := ExpandEnvironmentPath(Command); Result := GetWinPath(Result); if not FileExists(Result) then begin if DirectoryExists(Result) then Result := IncludeTrailingPathDelimiter(Result) else begin Path := TStringList.Create; PathExt := TStringList.Create; try Path.Delimiter := PathSep; Path.DelimitedText := GetEnvironmentVariable('Path'); Path.Append(GetShellFolder($0028)); PathExt.Delimiter := PathSep; PathExt.DelimitedText := LowerCase(GetEnvironmentVariable('PathExt')); if PathExt.Count > 0 then for i := 0 to Pred(PathExt.Count) do if FileExists(ChangeFileExt(Result, PathExt[i])) then begin Result := ChangeFileExt(Result, PathExt[i]); Exit; end; if Path.Count > 0 then for j := 0 to Pred(Path.Count) do begin if FileExists(IncludeTrailingPathDelimiter(Path[j])+Result) then begin Result := IncludeTrailingPathDelimiter(Path[j])+Result; Exit; end else if DirectoryExists(IncludeTrailingPathDelimiter(Path[j])+Result) then begin Result := IncludeTrailingPathDelimiter(IncludeTrailingPathDelimiter(Path[j])+Result); Exit; end else if PathExt.Count > 0 then for i := 0 to Pred(PathExt.Count) do if FileExists(ChangeFileExt(IncludeTrailingPathDelimiter(Path[j])+Result, PathExt[i])) then begin Result := ChangeFileExt(IncludeTrailingPathDelimiter(Path[j])+Result, PathExt[i]); Exit; end; end; Result := ''; finally Path.Free; PathExt.Free; end; end; end; end; var s,param: string; i: Integer; b: Boolean; begin if Sender is TButton then begin s := FindExecute(programs[(Sender as TButton).tag]); param := ''; if s = '' then begin s := programs[(Sender as TButton).tag]; i := 1; b := False; while (i <= Length(s)) and ((s[i] <> ' ') or b) do begin if s[i] = '"' then b := not b; Inc(i); end; param := Trim(Copy(s, i+1, Length(s))); s := FindExecute(StringReplace(Trim(Copy(s, 1, i-1)), '"', '', [rfReplaceAll])); end; if s = '' then ShowMessage('Fehlerhafter Autostart-Eintrag') else ShellExecute(Handle, 'open', PChar(s), PChar(param), PChar(GetShellFolder($0028)), 1); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:04 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