Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Start einer .LNK Verknüpfung mit Shellexecute


sebastianf - So 25.04.04 19:31
Titel: Start einer .LNK Verknüpfung mit Shellexecute
Nachdem ich nun meine Icons anklicken kann (vorherige Post :D )
Möchte ich die LNK Verknüpfungen mittels Shellexecute starten.


Delphi-Quelltext
1:
 shellexecute(0,'open',pchar('C:\Freecell.lnk'),nil,pchar('C:\'),sw_show);                    


da tut sich leider nichts.
Ich habe versucht, mittles FindExecutable die entsprechende Exe zu finden, bekomme allerdings nie einen entsprechenden Wert zurückgeliefert.

Wo ist denn da (schon wieder) der Haken ?


:oops:

Moderiert von user profile iconPeter Lustig (21:28, 25.04.2004): Code- durch Delphi-Tags ersetzt


toms - So 25.04.04 19:35

Hi,

Probier's mal so:


Delphi-Quelltext
1:
ShellExecute(0nil, PChar('C:\Freecell.lnk'), nil, PChar('C:\'), SW_SHOW);                    


sebastianf - So 25.04.04 19:45

Leider nein..
danke trotzdem ... :(


toms - So 25.04.04 19:51

Bei mir funktioniert das problemlos (WinXp)
Existiert 'C:\Freecell.lnk' überhaupt?

Check's mal:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
uses
 ShellApi;

procedure TForm1.Button1Click(Sender: TObject);
begin
 if FileExists('C:\Freecell.lnk'then
   ShellExecute(0nil, PChar('C:\Freecell.lnk'), nil, PChar('C:\'), SW_SHOW)
 else
  ShowMessage('C:\Freecell.lnk nicht gefunden');
end;


sebastianf - So 25.04.04 19:58

Leider ebenfalls nicht.

Nutze WindowsXP, Delphi7, Shellapi eingebunden ...
er geht in den richtigen Zweig, und startet trotzdem nicht...

:-(
hier mal der vollständige code:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
  
unit Unit1;
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,shellapi;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 if FileExists('C:\Freecell.lnk'then
   ShellExecute(0nil, PChar('C:\Freecell.lnk'), nil, PChar('C:\'), SW_SHOW)

 else
  ShowMessage('C:\Freecell.lnk nicht gefunden');
end;
end.

.. ist eigentlich trivial - aber es klappt leider nicht.

Moderiert von user profile iconPeter Lustig (21:26, 25.04.2004): Code- durch Delphi-Tags ersetzt


toms - So 25.04.04 20:01

Zitat:
Leider ebenfalls nicht.


Was meinst du damit? Existiert nun 'C:\Freecell.lnk' oder nicht?


sebastianf - So 25.04.04 20:03

sorry - also die Datei existiert selbstverständlich - er verzweigt auch in den richtigen pfad -
überprüft mit :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Button1Click(Sender: TObject);
begin
 if FileExists('C:\Freecell.lnk'then
     begin
   ShellExecute(0nil, PChar('C:\Freecell.lnk'), nil, PChar('C:\'), SW_SHOW);
   showmessage('Datei existiert');
     end
 else
  ShowMessage('C:\Freecell.lnk nicht gefunden');
end;
end.


aber die verflixte Exe startet nicht :-(
hab grad was rausgefunden :shellexecute gibt 31 zurück! (SE_ERR_NOASSOC )
laut der OH bedeutet das : "Mit der angegebenen Dateinamenserweiterung ist keine Anwendung verknüpft"

Glaub ich nicht - mit einem doppelklick auf die verknüpfung startet das jeweilige Programm (hier z.B. Freecell)

Moderiert von user profile iconPeter Lustig (21:26, 25.04.2004): Code- durch Delphi-Tags ersetzt


sebastianf - So 25.04.04 21:04

Ich habe die Lösung rausgefunden:
Da die LNK Dateien aus irgendeinem Grund nicht gestartet werden können,
lese ich mit


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure ShowTarget(LinkFile : WideString);
var IU : IUnknown;
    SL : IShellLink;
    PF : IPersistFile;
    FindDate : TWin32FindData;
    TargetFile : array[0..MAX_PATH] of char;
begin
// Herstellen des IShellLink und IPersistFile zum Zugriff auf die .LNK Datei. }
  IU := CreateComObject(CLSID_ShellLink);
  SL := IU as IShellLink;
  PF := SL as IPersistFile;
// .LNK Datei in IPersistFile Objekt laden.
  PF.Load(PWideChar(LinkFile), STGM_READ);
// Den Link durch Aufruf der Resolve-Methode auflösen
  SL.Resolve(0, SLR_ANY_MATCH or SLR_NO_UI);
// Jetzt kommt man an die Infos
  SL.GetPath(TargetFile, MAX_PATH, FindDate, SLGP_UNCPRIORITY);
// Zieldatei ausgeben
  ShowMessage(TargetFile);
end;


die ausführbare Exe aus, und starte diese dann mit shellexecute ! Das klappet :-)

Moderiert von user profile iconPeter Lustig (21:27, 25.04.2004): Code- durch Delphi-Tags ersetzt


toms - So 25.04.04 21:15

Hi,

Habe auch an deine Lösung gedacht, jedoch nimmt's mich Wunder, warum das mit
ShellExecute nicht geht...?


sebastianf - So 25.04.04 21:20

frag mich nicht - keine Ahnung.
hab mich sogar etwas auf msdn umgesehen, aber hab auch keine lösung !
danke dir trotzdem 1000 mal für deine mühe !
bis die tage :-)


Christian S. - So 25.04.04 21:28

Hallo, sebastianf!

Bitte benutze demnächst die Delphi-Tags. Durch die Delphi-Tags wird der Code mit Syntax-Highlighting angezeigt und ist somit sehr viel übersichtlicher.

Viele Dank!
Peter


Delete - Mo 26.04.04 18:04

Und was für einen Wert liefert Shellexecute zurück?


Delete - Di 02.11.04 16:54

Ich würde auch gerne Verknüpfungen per ShellExecute öffnen. Daher bin ich auf diesen Thread gestoßen. Wie ich auch nach vergeblichen Versuchen festgestellt habe, funktioniert das nicht mit dem Pfad der lnk-Datei und deshalb wollt ich den von sebastianf geposteten Code ausprobieren. Nur leider kann ich das ganze nicht kompilieren. Habe auch WinXp und Delphi 7 und alles mögliche bei den Uses eingebunden, aber offenbar nicht das richtige um "IPersistFile" zu kompilieren. Freue mich auf Erklärungen/Lösungen zu diesem Problem..

Mfg
10f10


Delete - Di 02.11.04 17:27

Gibt eigentlich nur 3 Möglichkeiten, d.h. 2

Delphi-Quelltext
1:
2:
uses
  ShellAPI, ShlObj;

und u.U. noch

Delphi-Quelltext
1:
2:
uses
  ActiveX;


Delete - Di 02.11.04 17:41

"Active X" wars. Danke für die schnelle Hilfe :)