Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Programmstart durch Autostart - kann man das herausfinden? (https://www.delphipraxis.net/77166-programmstart-durch-autostart-kann-man-das-herausfinden.html)

Martin K 16. Sep 2006 12:58

Re: Programmstart durch Autostart - kann man das herausfinde
 
Vielleicht lässt Du Dir mal den genauen ShellExecute-Aufruf anzeigen, zB:
Delphi-Quellcode:
ShowMessage(name);
ShowMessage(workdir);
Sag mir doch mal, was jeweils bei den Aufrufen von den Programmen wo es nicht klappt, angezeigt wird.

//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.

Flare 16. Sep 2006 13:11

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

Martin K 16. Sep 2006 13:30

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)

Flare 16. Sep 2006 13:42

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

Martin K 16. Sep 2006 14:00

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.

Flare 16. Sep 2006 14:04

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

Martin K 16. Sep 2006 14:11

Re: Programmstart durch Autostart - kann man das herausfinde
 
Kennst Du die Funktion Delphi-Referenz durchsuchenFileExists() ?

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...

phXql 16. Sep 2006 14:20

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?

Flare 16. Sep 2006 14:27

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

Martin K 16. Sep 2006 14:46

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.
Seite 3 von 3     123   

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