Seite 1 von 1

Zielpfad von Verknüpfung korrekt unter Windows-x64 ermitteln

Verfasst: 31.12.2010 18:23
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

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

Verfasst: 31.12.2010 21:01
von Sicro
Problem wurde durch die Lösung von diesem Thread ebenfalls gelöst:
Wie ermittle ich "C:\Program Files\" mit SpecialFolders

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

Verfasst: 10.09.2011 05:47
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.

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

Verfasst: 10.09.2011 09:11
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

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

Verfasst: 10.09.2011 15:23
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

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

Verfasst: 10.09.2011 15:36
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.

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

Verfasst: 10.09.2011 18:53
von Sicro
Habe die Bedingung nun in die DataSection verlagert.