Basic Univers

; obtenir le chemin du fichier vers lequel pointe un raccourcis.

ProcedureDLL.s ShellLink_GetPath(ShellLinkFile.s)
  Protected ShellLink.IShellLinkA, PersistFile.IPersistFile, *buffer, result.s
  If CoInitialize_(0) = #S_OK
    If CoCreateInstance_(?CLSID_ShellLink, 0, 1, ?IID_IShellLink, @ShellLink) = #S_OK
      If ShellLink\QueryInterface(?IID_IPersistFile, @PersistFile) = #S_OK
        *buffer = AllocateMemory( #MAX_PATH )
        If *buffer
          If MultiByteToWideChar_( #CP_ACP , 0, @ShellLinkFile, - 1, *buffer, #MAX_PATH )
            If PersistFile\Load(*buffer, 0) = #S_OK
              If ShellLink\Resolve(0, 1) = #S_OK
                RtlZeroMemory_(*buffer, #MAX_PATH )
                ShellLink\GetPath(*buffer, #MAX_PATH , 0, 0)
                result = PeekS(*buffer)
              EndIf
            EndIf
          EndIf
          FreeMemory(*buffer)
        EndIf
        PersistFile\Release()
      EndIf
      ShellLink\Release()
    EndIf
    CoUninitialize_()
  EndIf
  ProcedureReturn result
  DataSection
  CLSID_ShellLink: Data.q $0000000000021401, $46000000000000C0
  IID_IShellLink: Data.q $00000000000214EE, $46000000000000C0
  IID_IPersistFile: Data.q $000000000000010B, $46000000000000C0
  EndDataSection
EndProcedure

Debug ShellLink_GetPath( "c:\purebasic.lnk" )