Zielpfad von Verknüpfung korrekt unter Windows-x64 ermitteln

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Zielpfad von Verknüpfung korrekt unter Windows-x64 ermitteln

Beitrag von Sicro »

Hallo zusammen,

ich habe folgende Procedure zur Ermittlung des Zielpfades einer Verknüpfung:

Code: Alles auswählen

Procedure.s GetShellLinkTargetPath(ShellLinkFilePath.s)
  Protected RetVal.s = Space(#MAX_PATH + 1)
  Protected ShellLink.IShellLinkA, LinkFile.IPersistFile
  
  CoInitialize_(0)
  If CoCreateInstance_(?CLSID_ShellLink, 0, 1, ?IID_IShellLink, @ShellLink) = #S_OK
    If ShellLink\QueryInterface(?IID_IPersistFile, @LinkFile) = #S_OK
      If LinkFile\Load(ShellLinkFilePath, 0) = #S_OK
        If ShellLink\Resolve(0, 1) = #S_OK
          ShellLink\GetPath(RetVal, #MAX_PATH, 0, 0)
        EndIf
      EndIf
    EndIf
    LinkFile\Release()
  EndIf
  ShellLink\Release()
  CoUninitialize_()
  ProcedureReturn RetVal

  DataSection
    CLSID_ShellLink:
    ; 00021401-0000-0000-C000-000000000046
    Data.l $00021401
    Data.w $0000,$0000
    Data.b $C0,$00,$00,$00,$00,$00,$00,$46
   
    IID_IShellLink:
    ; 000214EE-0000-0000-C000-000000000046
    Data.l $000214EE
    Data.w $0000,$0000
    Data.b $C0,$00,$00,$00,$00,$00,$00,$46
   
    IID_IPersistFile:
    ; 0000010b-0000-0000-C000-000000000046
    Data.l $0000010b
    Data.w $0000,$0000
    Data.b $C0,$00,$00,$00,$00,$00,$00,$46
  EndDataSection
EndProcedure
Diese Procedure liefert bei Verknüpfungen, die zu Dateien mit dem Anfangspfad "C:\Program Files (x86)\" verweisen, korrekte Pfadangaben, verweist die Verknüpfung jedoch zu einer Datei mit dem Anfangspfad "C:\Program Files\", wird trotzdem der Anfangspfad "C:\Program Files (x86)\" zurückgegeben.

Beispiel:

Code: Alles auswählen

Debug GetShellLinkTargetPath("C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Paint.Net.lnk")
; Sollte "C:\Program Files\Paint.NET\PaintDotNet.exe" liefern, 
; liefert jedoch "C:\Program Files (x86)\Paint.NET\PaintDotNet.exe"
Wie muss die Procedure abgeändert werden, damit ich auch bei Zielpfadangaben mit "C:\Program Files\" korrekte Rückgaben bekomme?

Mfg Sicro
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Zielpfad von Verknüpfung korrekt unter Windows-x64 ermit

Beitrag von Sicro »

Problem wurde durch die Lösung von diesem Thread ebenfalls gelöst:
Wie ermittle ich "C:\Program Files\" mit SpecialFolders
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Zielpfad von Verknüpfung korrekt unter Windows-x64 ermit

Beitrag von STARGÅTE »

@Sicro: Sry das ich dein Thema missbrauche, aber ich wollte kein eigenes aufmachen.

Meine Frage zu diesem Code da oben ist: Wie erhalte ich unter Unicode auch ein richtiges Ergebnis.
Denn mit dem obrigen Code bekomme ich nur 261 Leerzeichen zurück, wenn ich es unter Unicode kompiliere.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Zielpfad von Verknüpfung korrekt unter Windows-x64 ermit

Beitrag von ts-soft »

Nicht getestet!
Statt: IID_IShellLink: nimmste IID_IShellLinkW mit folgenden Wert:

Code: Alles auswählen

{000214F9-0000-0000-C000-000000000046}
Ich denke mal das kannste dann selber für die DataSection aufbereiten :wink:

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Zielpfad von Verknüpfung korrekt unter Windows-x64 ermit

Beitrag von Sicro »

@ STARGÅTE: Kein Problem ;-)
@ ts-soft: Danke, habe den Code angepasst :allright:

Code: Alles auswählen

Procedure.s GetShellLinkTargetPath(ShellLinkFilePath.s)
  Protected RetVal.s = Space(#MAX_PATH + 1)
  Protected LinkFile.IPersistFile
  
  CompilerSelect #PB_Compiler_Unicode
    CompilerCase #True:  Protected ShellLink.IShellLinkW
    CompilerCase #False: Protected ShellLink.IShellLinkA
  CompilerEndSelect
  
  CoInitialize_(0)
  
  If CoCreateInstance_(?CLSID_ShellLink, 0, 1, ?IID_IShellLink, @ShellLink) = #S_OK
    If ShellLink\QueryInterface(?IID_IPersistFile, @LinkFile) = #S_OK
      If LinkFile\Load(ShellLinkFilePath, 0) = #S_OK
        If ShellLink\Resolve(0, 1) = #S_OK
          CompilerSelect #PB_Compiler_Unicode
            CompilerCase #True:  ShellLink\GetPath(@RetVal, #MAX_PATH, 0, 0)
            CompilerCase #False: ShellLink\GetPath(RetVal, #MAX_PATH, 0, 0)
          CompilerEndSelect
        EndIf
      EndIf
      LinkFile\Release()
    EndIf
    ShellLink\Release()
  EndIf
    
  CoUninitialize_()
  
  ProcedureReturn RetVal

  DataSection
    CLSID_ShellLink:
    ; 00021401-0000-0000-C000-000000000046
    Data.l $00021401
    Data.w $0000,$0000
    Data.b $C0,$00,$00,$00,$00,$00,$00,$46
    
    IID_IShellLink:
    CompilerIf #PB_Compiler_Unicode
      ; IID_IShellLinkW
      ; {000214F9-0000-0000-C000-000000000046}
      Data.l $000214F9
      Data.w $0000,$0000
      Data.b $C0,$00,$00,$00,$00,$00,$00,$46
    CompilerElse
      ; 000214EE-0000-0000-C000-000000000046
      Data.l $000214EE
      Data.w $0000,$0000
      Data.b $C0,$00,$00,$00,$00,$00,$00,$46
    CompilerEndIf
       
    IID_IPersistFile:
    ; 0000010b-0000-0000-C000-000000000046
    Data.l $0000010b
    Data.w $0000,$0000
    Data.b $C0,$00,$00,$00,$00,$00,$00,$46
  EndDataSection
EndProcedure
Zuletzt geändert von Sicro am 10.09.2011 18:48, insgesamt 2-mal geändert.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Zielpfad von Verknüpfung korrekt unter Windows-x64 ermit

Beitrag von STARGÅTE »

Danke euch beiden

@Sicro:
bitte nimm das "einzel" IF aus dem CompilerSelect-Block, dass zerreißt sonst die Einrückfunktion, weil 2 IFs aber nur ein EndIf gefunden wird.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Zielpfad von Verknüpfung korrekt unter Windows-x64 ermit

Beitrag von Sicro »

Habe die Bedingung nun in die DataSection verlagert.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Antworten