Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Verknüpfungen (shortcuts) lesen (https://www.delphipraxis.net/11874-verknuepfungen-shortcuts-lesen.html)

MatthiasW 15. Nov 2003 18:13


Verknüpfungen (shortcuts) lesen
 
Hallo,

ich möchte mir eine eigene Schnellstartsymbolleiste proggen (so eine mit den Programmsymbolen zum schnellen starten der Programme). Hat jemand ne Idee wie ich das Verknüpfungsziel aus der lnk - Datei auslesen kann? Diese Datei ist nach eigenen Recherchen anscheinend keine blose Textdatei.
Gibts da zb. ne Byteposition und die zugehörige länge an der ich das lesen kann?

Mfg Matthias

Luckie 15. Nov 2003 18:19

Re: Verknüpfungen (shortcuts) lesen
 
http://www.luckie-online.de/files/myoldstuff/ -> LinkMaker

Ist zwar der umgekehrte Weg, aber das macht nichts. Statt Set... eben Get... Jedenfalls sollte das Prinzip klar werden. :wink:

toms 15. Nov 2003 18:41

Re: Verknüpfungen (shortcuts) lesen
 
Stichworte: IPersistFile, TShellLinkInfoStruct.

MatthiasW 15. Nov 2003 21:00

Re: Verknüpfungen (shortcuts) lesen
 
Hallo,

danke für eure schnelle Hilfe, werds mir jetzt mal anschauen

Mfg Matthias

MatthiasW 15. Nov 2003 22:13

Re: Verknüpfungen (shortcuts) lesen
 
Hallo,

also wenn ich jetzt aus dieser lnk - File was lesen will sollte ich also als erstes einen "interface pointer" für IPersistFile erzeugen, dies wird bin ich mir sicher ebenfalls mit der Funktion "CoCreateInstance" gemacht. Aber welchen CLSID übergeb ich dem?
Wäre net, wenn ihr mir net Tip geben könntet wie diese Zeile aussehen sollte.

Den "Link" binde ich wohl dann mit "Link := PersistFile as IShellLink". Jetzt brauch ich die Daten ja wohl nur noch mit den "Get" - Funktionen auslesen.

Mfg Matthias

Duffy 15. Nov 2003 22:22

Re: Verknüpfungen (shortcuts) lesen
 
Hallo MatthiasW,
ich glaube das hilft weiter ...
Delphi-Quellcode:
CLSID_ShellLink: TGUID = (
    D1: $00021401; D2: $0; D3: $0; D4: ($C0, $0, $0, $0, $0, $0, $0, $46));
  IID_IPersistFile: TGUID = (
    D1:$0000010B; D2:$0000; D3:$0000; D4:($C0,$00,$00,$00,$00,$00,$00,$46));
  IID_IShellLink : TGUID = (
    D1:$000214EE; D2:$0000; D3:$0000; D4:($C0,$00,$00,$00,$00,$00,$00,$46));
bye
Claus

Daniel 15. Nov 2003 23:17

Re: Verknüpfungen (shortcuts) lesen
 
Ich hatte hier in den Tiefen meiner Platte noch eine Funktion gefunden, die vermutlich genau das macht, was Du möchtest. Ich konnte sie aber weder testen noch näher begutachten. Und da es ein langer Tag war und ich nur noch ins Bett will, werfe ich diese Routine mal so in die Runde - wir können sie dann später ggf. nach kleinen Änderungen in die Code-Library stellen.

Delphi-Quellcode:
Procedure _ResolveShortCut( LNKFileName : PChar; outBuf : PChar; outBufSize : Cardinal );
var iPointer : IShellLink;
       myPPF : IPersistFile;
       fName : PWideChar;
      buffer : PChar;
       fData : TWin32FindData;
begin
  FillChar( outBuf^, outBufSize, 0 );
  CoInitialize( NIL );
  If (CoCreateInstance( OLE2.TGUID(CLSID_ShellLink), NIL, CLSCTX_INPROC_SERVER, OLE2.TGUID(IID_IShellLinkA), iPointer ) = S_OK) Then
    If (iPointer.QueryInterface( System.TGUID(IID_IPersistFile), myPPF ) = S_OK) Then
    Begin
      GetMem( fName, MAX_PATH+1 );
      StringToWideChar( LNKFileName, fName, MAX_PATH );
      If (myPPF.Load( fName, STGM_READ ) = S_OK) Then
      Begin
        buffer:= StrAlloc( MAX_PATH+1 );
        FillChar( fData, SizeOf(TWin32FindData), 0 );
        If (iPointer.GetPath( buffer, MAX_PATH, fData, SLGP_RAWPATH ) = NO_ERROR) Then
          If StrLen( buffer ) <= outBufSize Then StrPCopy( outBuf, buffer );
        StrDispose( buffer );
      End;
      FreeMem( fName, MAX_PATH+1 );
      myPPF.Release;
    End;
  CoUnInitialize;
end;

MatthiasW 16. Nov 2003 07:56

Re: Verknüpfungen (shortcuts) lesen
 
Hallo,

Zitat:

Zitat von Daniel
Ich hatte hier in den Tiefen meiner Platte noch eine Funktion gefunden, die vermutlich genau das macht, was Du möchtest.

tja deine Prozedur läuft bei mir nicht, dem ist zB. "OLE2" unbekannt und auch das "IID_IPersistFile". Das kann möglicherweise daran liegen, das du Delphi6 Prof verwendest und ich nur Delphi5 Prof habe.

Ich habe mal folgenden Code versucht:

Code:
type TLnkFileData = record
       Link        : String;
       Description : String;
       IconPath    : String;
       IconIndex   : Integer;
     end;

function GetLinkFileData(LinkFile: String): TLnkFileData;
var
  wLinkFile        : WideString;
  PersistFile      : IPersistFile;
  Link             : IShellLink;
  TempValue        : PChar;
  iCharSize        : Integer;
begin
  wLinkFile := LinkFile;
  CoInitialize(nil);
  if CoCreateInstance(CLSID_SHellLink, nil, CLSCTX_INPROC_SERVER, IShellLink,
    Link) = S_OK then
  begin
    PersistFile := Link as IPersistFile;
    //Link := PersistFile as IShellLink;
    TempValue:= StrAlloc(MAX_PATH+1);
    PersistFile.Load(PWideChar(wLinkFile),STGM_READ);
    Link.GetDescription(TempValue,MAX_PATH);
    Result.Description := String(TempValue);
  end;
  CoUnInitialize;
end;
leider bleibt der TempValue leer :? nach dem Funktionsaufruf "GetDescription". Hat jemand ne Idee was ich da noch falsch mache?

Danke für eure Hilfe
Mfg Matthias

MathiasSimmack 16. Nov 2003 09:17

Re: Verknüpfungen (shortcuts) lesen
 
Ich habe auch nur D5 Pro. Du brauchst IMHO die Units "ShlObj" und "ActiveX" und "ComObj". Ich habe mal aus einem meiner Projekte die folgende Funktion rausgesucht:
Delphi-Quellcode:
  function GetLinkDestination(s: WideString): string;
  var
    aShellLink  : IShellLink;
    aPersistFile : IPersistFile;
    szData      : array[0 .. MAX_PATH] of char;
    aFindData   : TWin32FindData;
  begin
    aShellLink := CreateComObject(CLSID_ShellLink) as IShellLink;
    aPersistFile := aShellLink as IPersistFile;

    OleCheck(aPersistFile.Load(PWidechar(s),STGM_READ));
    OleCheck(aShellLink.GetPath(szData,MAX_PATH,aFindData,SLGP_SHORTPATH));

    Result := szData;
  end;
Allerdings bloß mit SLGP_SHORTPATH. Guck mal bei Daniel, der hat dort SLGP_RAWPATH stehen.

MatthiasW 16. Nov 2003 10:45

Re: Verknüpfungen (shortcuts) lesen
 
Ich habe für die Funktion von Daniel folgende Units eingebunden:

Code:
uses
  windows,
  ActiveX,
  ShellAPI,
  ShlObj,
  ComObj,
  sysutils;
und trotzdem meckert der Compiler das er das OLE2 nicht kennt. Was kann da denn noch falsch laufen, alle benötigten Units sind ja scheinbar vorhanden.

MathiasSimmack: Ich werd mal deine Funktion probieren, vielleicht klappts ja damit

Mfg Matthias

Daniel 16. Nov 2003 10:51

Re: Verknüpfungen (shortcuts) lesen
 
@MatthiasW:
Ich kann Dir nicht sagen, wie es unter D5 Pro aussieht, aber bei D6 Pro liegt die Unit OLE2 im Verzeichnis ./Source/RTL/Win, die habe ich dann einfach ins Verzeichnis ./Lib - Verzeichnis kopiert.

MatthiasW 16. Nov 2003 10:57

Re: Verknüpfungen (shortcuts) lesen
 
Zitat:

Zitat von Daniel
@MatthiasW:
Ich kann Dir nicht sagen, wie es unter D5 Pro aussieht, aber bei D6 Pro liegt die Unit OLE2 im Verzeichnis ./Source/RTL/Win, die habe ich dann einfach ins Verzeichnis ./Lib - Verzeichnis kopiert.

ja, genau das ist mein Problem: ich habe versucht die Unit "OLE2" einzubinden worauf ich die Meldung bekam, das diese nicht gefunden werden kann. Dann hab ich danach gesucht und die "OLE2.pas" im genannten Verzeichnis "./Source/RTL/Win" gefunden, aber nur die pas - Datei. Kann mir jetzt jemand verraten, wieso der die nicht einfach kompiliert und verwendet?

Im Verzeichnis "./Lib/Delphi2" existiert eine OLE2.dcu - Datei, aber ich denke mal die ist veraltet und nur zu kompatibilität vorhanden.

Aber die Frage die sich mir stellt ist: wie kann ich den Compiler davon überzeugen mir die OLE2.pas zu übersetzen?

Mfg Matthias

MatthiasW 16. Nov 2003 11:01

Re: Verknüpfungen (shortcuts) lesen
 
Hallo,

danke hat sich erledigt: OLE2.pas einfach ins LIb - Verzeichnis kopiert und der hat die OLE2.dcu erzeugt. :wall: :wall: :wall: :wall: :wall: :wall:

Mfg Matthias

Duffy 16. Nov 2003 11:02

Re: Verknüpfungen (shortcuts) lesen
 
Hallo MatthiasW,
einfach unter "Tools -> Umgebungsoptionen -> Bibilothek -> Bibiliothekspfad" folgenden Pfad anlegen
"$(DELPHI)\Lib\Delphi2"
bye
Claus

MatthiasW 16. Nov 2003 17:22

Re: Verknüpfungen (shortcuts) lesen
 
Hallo,

ich habs jetzt hinbekommen das ich die Daten aus der lnk - File lesen kann, nur gibt es immernoch ein problem: alle enthaltenen Daten auser der Description werden ordnungsgemäß gelesen. Bei der Description bekomm ich immer einen leerstring, hat jemand noch ne Idee woran das liegen kann?

Mfg Matthias

edosoft 28. Nov 2003 19:08

Re: Verknüpfungen (shortcuts) lesen
 
Vielleicht weil du Win98 hast und das erst ab XP unterstützt wird oder sowas?

MathiasSimmack 28. Nov 2003 21:08

Re: Verknüpfungen (shortcuts) lesen
 
Richtig! :)

MatthiasW 28. Nov 2003 23:07

Re: Verknüpfungen (shortcuts) lesen
 
Hallo,

Zitat:

Zitat von edosoft
Vielleicht weil du Win98 hast und das erst ab XP unterstützt wird oder sowas?

1. habe ich Windows 2000
2. ist deine Aussage falsch da das problem an fehlerhaften lnk files lag

scp 29. Nov 2003 01:21

Re: Verknüpfungen (shortcuts) lesen
 
Wenn du
Delphi-Quellcode:
function GetLinkFileData(LinkFile: String): TLnkFileData;
verwendest, korrigiere mal folgendes:

Delphi-Quellcode:
// ...
    Link.GetDescription(TempValue,MAX_PATH);
    Result.Description := StrPas(TempValue); // NICHT String()
  end;
  CoUnInitialize;
end;

MathiasSimmack 29. Nov 2003 07:23

Re: Verknüpfungen (shortcuts) lesen
 
Zitat:

Zitat von MatthiasW
Hallo,

Zitat:

Zitat von edosoft
Vielleicht weil du Win98 hast und das erst ab XP unterstützt wird oder sowas?

1. habe ich Windows 2000
2. ist deine Aussage falsch da das problem an fehlerhaften lnk files lag

Die Aussage von edosoft ist trotzdem richtig. Mag sein, dass das Problem bei dir an einer fehlerhaften LNK-Datei lag. Dennoch unterstützen 95, 98 und NT4 keine Kommentare.

Aike 4. Aug 2005 14:56

Re: Verknüpfungen (shortcuts) lesen
 
Delphi-Quellcode:
uses ShlObj, ComObj, ActiveX;
 
function GetLinkDestination(s: WideString): string;
var aShellLink  : IShellLink;
    aPersistFile : IPersistFile;
    szData      : array[0 .. MAX_PATH] of char;
    aFindData   : TWin32FindData;
begin
  aShellLink := CreateComObject(CLSID_ShellLink) as IShellLink;
  aPersistFile := aShellLink as IPersistFile;

  OleCheck(aPersistFile.Load(PWidechar(s),STGM_READ));
  OleCheck(aShellLink.GetPath(szData,MAX_PATH,aFindData,SLGP_SHORTPATH));

  Result := szData;
end;
Allererste Sahne. Funktioniert einwandfrei, gibt aber wegen "SLGP_SHORTPATH" (wie erwähnt) nur 8-Zeichen-lange Pfade zurück, stört aber nicht beim Ausführen von Dateien.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:55 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