![]() |
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 |
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. |
Re: Verknüpfungen (shortcuts) lesen
Zitat:
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 |
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 |
Re: Verknüpfungen (shortcuts) lesen
Hallo MatthiasW,
einfach unter "Tools -> Umgebungsoptionen -> Bibilothek -> Bibiliothekspfad" folgenden Pfad anlegen "$(DELPHI)\Lib\Delphi2" bye Claus |
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 |
Re: Verknüpfungen (shortcuts) lesen
Vielleicht weil du Win98 hast und das erst ab XP unterstützt wird oder sowas?
|
Re: Verknüpfungen (shortcuts) lesen
Richtig! :)
|
Re: Verknüpfungen (shortcuts) lesen
Hallo,
Zitat:
2. ist deine Aussage falsch da das problem an fehlerhaften lnk files lag |
Re: Verknüpfungen (shortcuts) lesen
Wenn du
Delphi-Quellcode:
verwendest, korrigiere mal folgendes:
function GetLinkFileData(LinkFile: String): TLnkFileData;
Delphi-Quellcode:
// ...
Link.GetDescription(TempValue,MAX_PATH); Result.Description := StrPas(TempValue); // NICHT String() end; CoUnInitialize; end; |
Re: Verknüpfungen (shortcuts) lesen
Zitat:
|
Re: Verknüpfungen (shortcuts) lesen
Delphi-Quellcode:
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.
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; |
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