AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Programmstart durch Autostart - kann man das herausfinden?
Thema durchsuchen
Ansicht
Themen-Optionen

Programmstart durch Autostart - kann man das herausfinden?

Ein Thema von Flare · begonnen am 15. Sep 2006 · letzter Beitrag vom 16. Sep 2006
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#21

Re: Programmstart durch Autostart - kann man das herausfinde

  Alt 16. Sep 2006, 13:58
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.
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Flare

Registriert seit: 26. Jan 2006
Ort: Leipzig
529 Beiträge
 
Delphi 7 Professional
 
#22

Re: Programmstart durch Autostart - kann man das herausfinde

  Alt 16. Sep 2006, 14:11
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
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
Willy Scheibel
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#23

Re: Programmstart durch Autostart - kann man das herausfinde

  Alt 16. Sep 2006, 14:30
Was wird denn genau bei ShowMessage angezeigt, wenn es nicht funktioniert?
(also MSN 7.5 und ICQ und Sounkartenmixer)
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Flare

Registriert seit: 26. Jan 2006
Ort: Leipzig
529 Beiträge
 
Delphi 7 Professional
 
#24

Re: Programmstart durch Autostart - kann man das herausfinde

  Alt 16. Sep 2006, 14:42
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 Auch wenn ich dadurch immer noch nicht weiß warum es mal nicht und dann auf einmal doch klappt Das Ganze sollte doch schon zuverlässig sein.

Flare
Willy Scheibel
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#25

Re: Programmstart durch Autostart - kann man das herausfinde

  Alt 16. Sep 2006, 15:00
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.
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Flare

Registriert seit: 26. Jan 2006
Ort: Leipzig
529 Beiträge
 
Delphi 7 Professional
 
#26

Re: Programmstart durch Autostart - kann man das herausfinde

  Alt 16. Sep 2006, 15:04
Das ist mir schon klar, bloß wenn du mir mal meinen Code anguckst weißt du auch warum da getrennt wird
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
Willy Scheibel
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#27

Re: Programmstart durch Autostart - kann man das herausfinde

  Alt 16. Sep 2006, 15:11
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...
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Benutzerbild von phXql
phXql

Registriert seit: 11. Mär 2004
Ort: Mühldorf
824 Beiträge
 
#28

Re: Programmstart durch Autostart - kann man das herausfinde

  Alt 16. Sep 2006, 15:20
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?
"Dunkel die andere Seite ist"
"Yoda! Halts Maul und iss deinen Toast!"
  Mit Zitat antworten Zitat
Flare

Registriert seit: 26. Jan 2006
Ort: Leipzig
529 Beiträge
 
Delphi 7 Professional
 
#29

Re: Programmstart durch Autostart - kann man das herausfinde

  Alt 16. Sep 2006, 15:27
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
Willy Scheibel
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#30

Re: Programmstart durch Autostart - kann man das herausfinde

  Alt 16. Sep 2006, 15:46
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;
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz