Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Link einer Verknpfung auslesen (https://www.delphipraxis.net/69248-link-einer-verknuepfung-auslesen.html)

mumu 12. Mai 2006 11:16


Link einer Verknpfung auslesen
 
ber diesen Code lese ich die Datei aus auf die eine Verknpfung zeigt. (variable link ist dabei die verknpfung selbst und in der variable buff steht nach aufruf die datei auf die die Verknpfung zeigt.

Delphi-Quellcode:
var
  MyObject: IUnknown;
  MySLink: IShellLink;
  MyPFile: IPersistFile;
  FileInfo: TWin32FINDDATA;
  WidePath: array[0..MAX_PATH] of WideChar;
  Buff: array[0..MAX_PATH] of Char;
begin
    MyObject := CreateComObject(CLSID_ShellLink);
    MyPFile := MyObject as IPersistFile;
    MySLink := MyObject as IShellLink;

    StringToWideChar(link, WidePath, SizeOf(WidePath));
    MyPFile.Load(WidePath, STGM_READ);
    MySLink.GetPath(Buff, Max_PATH, FileInfo, SLGP_UNCPRIORITY);
end;
Das funktioniert eigentlich alles wunderbar. Nur folgendes Problem:
Ich hab 2 Betriebssysteme installiert (Windows 2000 auf Laufwerk D und XP auf Laufwerk E).
Wenn ich jetzt unter Windows 2000 bestimmte Verknpfungen aus dem Windows XP Startmen Pfad auslese, dann zeigen die Verknpfungen auf die Festplatte D, obwohl Sie eigentlich auf Laufwerk E zeigen mssten. Ich hab mir mal den Inhalt einer lnk datei (die sich im Windows XP Startmen befindet) unter windows 2000 anzeigen lassen.

Delphi-Quellcode:
L             F       ߧ܃YTT
Z `SOQ                     A PO :i +00 /E:\                   B 1     4/7 PROGRA~1  *   ニ4x4/7   P r o g r a m m e   N 1     4Oq MSNGAM~1  6   ニ4Oq46   M S N  G a m i n g  Z o n e   < 1     4Pq Windows &   ニ4Oq46   W i n d o w s   F 2 Q  - `  bckgzm.exe ,   ニ4Pq4O;   b c k g z m . e x e     h           7       g        
o    Windows XP E:\Programme\MSN Gaming Zone\Windows\bckgzm.exe 7 @ E : \ P r o g r a m m e \ M S N  G a m i n g  Z o n e \ W i n d o w s \ b c k g r e s . d l l , - 1 2 1 3 ; . . \ . . \ . . \ . . \ . . \ P r o g r a m m e \ M S N  G a m i n g  Z o n e \ W i n d o w s \ b c k g z m . e x e  % H O M E D R I V E % % H O M E P A T H % `     *X      laptop          /!8O&|~, 
Q@ /!8O&|~, 
Q@     *&  o
eigentlich ist hier nix mit %SystemRoot% oder hnliches? Warum ist der Pfad auf diese Datei aber trotzdem
D:\Programme\MSN Gaming Zone\Windows\bckgzm.exe wenn ich ihn unter Windows 2000 ber den oben genannten Code auslese?

mumu 12. Mai 2006 12:40

Re: Link einer Verknpfung auslesen
 
ich hab auch schon probiert SLGP_UNCPRIORITY durch SLGP_RAWPATH zu ersetzen. ohne erfolg.

ich hab mal in windows 2000 mir das Dokumente und Einstellungen - AllUsers - Startmen angeschaut. Wenn ich mir die Links anschau, dann verweisen wirklich alle komplett auf D:\..., wenn ich Sie mir unter Windows XP anschau, die Links, dann verweisen diese korrekterweise auf E:\...

woran kann das liegen?

shmia 12. Mai 2006 14:28

Re: Link einer Verknpfung auslesen
 
Ich wrde dir empfehlen, die Funktion ShellLinkResolve aus der JCL (Unit JclShell) zu verwenden.
Diese Funktion ist bestimmt besser als deine, da dutzendfach getestet.
http://sourceforge.net/projects/jcl
Kleiner Auszug aus dem Sourcecode
Delphi-Quellcode:
    PersistFile := ShellLink as IPersistFile;
    // PersistFile.Load fails if the filename is not fully qualified
    // AHA: hast du das beachtet ?
    FullPath := ExpandFileName(FileName);
    MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, PChar(FullPath), -1, LinkName, MAX_PATH);
    Result := PersistFile.Load(LinkName, STGM_READ);

mumu 12. Mai 2006 14:53

Re: Link einer Verknpfung auslesen
 
ja das hab ich auch schon ausprobiert. auch mit anderen fertigen funktionen von swissdelphicenter oder so funktionierts nicht.

ich glaub es liegt eher direkt an windows. weil windows 2000 nmlich direkt den falschen link anzeigt, wenn ich ihn mir anschau. jedoch unter windows xp wird er korrekt dargestellt.

woran kann das liegen?

shmia 12. Mai 2006 16:44

Re: Link einer Verknpfung auslesen
 
Zitat:

Zitat von mumu
ich glaub es liegt eher direkt an windows. weil windows 2000 nmlich direkt den falschen link anzeigt, wenn ich ihn mir anschau. jedoch unter windows xp wird er korrekt dargestellt.

Dann wrde ich mal prfen, ob der aktuellste Servicepack installiert ist und ggf. installieren.
Evtl. findet sich auch etwas bei MS in der Knowledge Base.

mumu 13. Mai 2006 12:25

Re: Link einer Verknpfung auslesen
 
hmm naja service packs usw... sind alle installiert.

wei nicht, irgendwie kommt mir das so vor, als wrde das boot-laufwerk in den link eingefgt. und je nachdem von welchem laufwerk ich starte, wird dieser laufwerksbuchstabe als basis fr den link genommen. nur ich hab mir ja den link mal angeschaut und da ist eigentlich der laufwerksbuchstabe fest eincodiert und nicht irgendwie ber ein %variable% oder so...


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:49 Uhr.

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