![]() |
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 |
Re: Verknüpfungen (shortcuts) lesen
![]() Ist zwar der umgekehrte Weg, aber das macht nichts. Statt Set... eben Get... Jedenfalls sollte das Prinzip klar werden. :wink: |
Re: Verknüpfungen (shortcuts) lesen
Stichworte: IPersistFile, TShellLinkInfoStruct.
|
Re: Verknüpfungen (shortcuts) lesen
Hallo,
danke für eure schnelle Hilfe, werds mir jetzt mal anschauen Mfg Matthias |
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 |
Re: Verknüpfungen (shortcuts) lesen
Hallo MatthiasW,
ich glaube das hilft weiter ...
Delphi-Quellcode:
bye
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)); Claus |
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; |
Re: Verknüpfungen (shortcuts) lesen
Hallo,
Zitat:
Ich habe mal folgenden Code versucht:
Code:
leider bleibt der TempValue leer :? nach dem Funktionsaufruf "GetDescription". Hat jemand ne Idee was ich da noch falsch mache?
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; Danke für eure Hilfe Mfg Matthias |
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:
Allerdings bloß mit SLGP_SHORTPATH. Guck mal bei Daniel, der hat dort SLGP_RAWPATH stehen.
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; |
Re: Verknüpfungen (shortcuts) lesen
Ich habe für die Funktion von Daniel folgende Units eingebunden:
Code:
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.
uses
windows, ActiveX, ShellAPI, ShlObj, ComObj, sysutils; MathiasSimmack: Ich werd mal deine Funktion probieren, vielleicht klappts ja damit Mfg Matthias |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 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