Delphi-PRAXiS
Seite 1 von 3  1 23      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:43 Uhr.
Seite 1 von 3  1 23      

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