Autor Beitrag
FlaShGordon
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

WIN XP

BeitragVerfasst: Mi 28.11.07 19:22 
Hallo,

Die Suche war erfolglos, deshalb hier die Frage:

Wie kann ich die Ziel-Adresse eines Links ermitteln, wenn
ich nur den Pfad des Links kenne?

edit: nochmal richtig beschrieben im nächsten Post von mir...

Danke schon Mal!


Zuletzt bearbeitet von FlaShGordon am Mi 28.11.07 20:38, insgesamt 1-mal bearbeitet
Atreyu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 137


Delphi 7 Enterprise
BeitragVerfasst: Mi 28.11.07 19:26 
Was genau meinst du? Die IP?
FlaShGordon Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

WIN XP

BeitragVerfasst: Mi 28.11.07 19:29 
Ich meine eine Windows-Verknüpfung (sry, schlecht ausgedrückt), die einen Windows-Pfad beinhaltet. diesen Pfad hätte ich gerne...

Ich habe was gefunden, weiß aber nicht so recht, wie genau das aussehen muss:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
var psl : IShellLink;
...

   psl.SetWorkingDirectory(PChar([Pfad der Verknüpfung]));
   ShellListView2.Root := psl.GetPath;


Dieses "psl.GetPath" ist wohl Blödsinn, da weiß ich (noch) nicht was ich schreiben soll.
Außerdem verwechsle ich ganz gerne mal "SetWorkingDirectory/GetWorkingDirectory" und "SetPath/GetPath".
KA ob das jetzt richtigrum ist ...
Atreyu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 137


Delphi 7 Enterprise
BeitragVerfasst: Mi 28.11.07 21:42 
Also ich hab mal was gefunden, aber frag mich dazu nix, es stand nur unter "Verknüpfungen (*.lnk) auslesen und erstellen":
www.delphifree.de/list21.htm
FlaShGordon Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

WIN XP

BeitragVerfasst: Mi 28.11.07 21:57 
Das hab ich inzwischen auch gefunden. Merkwürdigerweise liefert die Funktion (Nachdem ich die Fehler ausgemerzt habe) immer einen leeren String zurück...

Das sieht bei mir so aus...

ShellList.pas
ausblenden volle Höhe 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:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
unit ShellLink;

interface

uses
  Windows, SysUtils, Classes, Menus, ShlObj, CommCtrl, ComObj, ActiveX;

type TShellLinkInfo = record
       Error : Boolean;
       LinkName : string[255];
       Description : string[225];
       FileName : string[225];
       WorkingDirectory : string[225];
       Arguments : string[225];
       WindowState : Integer;
       HotKey : TShortCut;
       IconFileName : string[225];
       IconIndex : Integer;
     end;

function GetShellLinkInfo(LinkName: string): TShellLinkInfo;

implementation

function GetShellLinkInfo(LinkName: string): TShellLinkInfo;
var HRes: HResult;
    Link: IShellLink;
    PerFile: IPersistFile;
    Buffer: array[0..255of Char;
    IntBuffer: Integer;
    WordBuffer: Word;
    Size: Integer;
    W: PWideChar;
    Data: TWin32FindData;

begin
result.Error:=False;

Size:=(Length(LinkName)+1) * sizeof(WideChar); GetMem(W, Size);
StringToWideChar(LinkName, W, Size);

HRes := CoInitialize(nil);
HRes := CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IShellLink, Link);
if not Succeeded(HRes) then result.Error:=True;

HRes:=Link.QueryInterface(IPersistFile, PerFile);
if not Succeeded(HRes) then result.Error:=True;

HRes := PerFile.Load(W, STGM_READ);
if not Succeeded(HRes) then result.Error:=True;

result.LinkName:=LinkName;

//Ziel
Link.GetPath(@Buffer, MAX_PATH-5, Data, SLGP_UNCPRIORITY);
result.FileName := StrPas(Buffer);

//Arbeitsverzeichnis
Link.GetWorkingDirectory(@Buffer, MAX_PATH-5);
result.WorkingDirectory := StrPas(Buffer);

//Link.Release;
//PerFile.Release;
CoUninitialize;

FreeMem(W, Size);
end;

end.

"Link.Release" und "PerFile.Release" sind rausgekürzt, da er mit "Release" nichts anfangen konnte. Hat es etwas damit zu tun?

Meine Unit
ausblenden Delphi-Quelltext
1:
showmessage(GetShellLinkInfo(ShellListView1.SelectedFolder.DisplayName).FileName);					
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 28.11.07 22:40 
user profile iconFlaShGordon hat folgendes geschrieben:
"Link.Release" und "PerFile.Release" sind rausgekürzt, da er mit "Release" nichts anfangen konnte. Hat es etwas damit zu tun?

Nun ja, um sonst wird der Programmierer das schon nicht dahin gestezt haben. :roll:
FlaShGordon Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

WIN XP

BeitragVerfasst: Mi 28.11.07 23:31 
Problem gelöst!

Die ".lnk"-Endung ist nicht im Pfad enthalten, also findet er die Verknüpfung nicht!
In der ShellList-Unit wird Error auf true gesetzt und der String bleibt leer. Der oben beschriebene Quelltext ist also (bis auf die Dateiendung in meiner Unit) richtig.

...Und "Link.Release" und "PerFile.Release" sind weiterhin auskommentiert.