Créer un raccourci

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Créer un raccourci

Message par Progi1984 »

Source : http://blog.developpez.com/progi1984/p7 ... /#more7409

Fonctionnel sous Linux & Windows (Unicode & Ascii).
Manque plus que la version MacOs.

Code : Tout sélectionner

Structure S_Shortcut
  sFilename.s
  sShortcutFile.s
  sWorkingDir.s
  sIconPath.s
  iIconIndex.l
  sDescription.s
  sArgs.s
  wHotkey.w
  iShowCmd.l
EndStructure


CompilerSelect #PB_Compiler_OS
  CompilerCase #PB_OS_Windows ;{
    ;@author : Rescator <http://www.purebasic.fr/english/viewtopic.php?t=24533>
    ;@author : Progi1984 ; modified for multiplateform
    ProcedureDLL.l CreateShortcut(*shortcuts_infos.S_Shortcut)
      Protected ppf.IPersistFile
      Protected lResult.l
      CompilerIf #PB_Compiler_Unicode
        Protected psl.IShellLinkW
      CompilerElse
        Protected psl.IShellLinkA, sMemUnicode.s
      CompilerEndIf
      Protected lnk_infos.S_Shortcut
      CopyMemory(*shortcuts_infos, @lnk_infos, SizeOf(S_Shortcut))
     
      If (LCase(Right(lnk_infos\sShortcutFile,4))<>".lnk")
        lnk_infos\sShortcutFile+".lnk"
      EndIf
      If lnk_infos\sWorkingDir = ""
        lnk_infos\sWorkingDir = GetPathPart(lnk_infos\sFilename)
      EndIf
      If lnk_infos\sIconPath = ""
        lnk_infos\sIconPath = lnk_infos\sFilename
        lnk_infos\iIconIndex = 0
      EndIf
      If lnk_infos\iShowCmd = 0
        lnk_infos\iShowCmd = #SW_SHOWNORMAL
      EndIf
     
      If CoInitialize_(#Null) = #S_OK
        If CoCreateInstance_(?CLSID_ShellLink, 0, 1,?IID_IShellLink, @psl) = #S_OK
          psl\SetArguments(@lnk_infos\sArgs)
          psl\SetDescription(@lnk_infos\sDescription)
          psl\SetHotkey(lnk_infos\wHotkey)
          psl\SetIconLocation(@lnk_infos\sIconPath, lnk_infos\iIconIndex)
          psl\SetPath(@lnk_infos\sFilename)
          psl\SetShowCmd(@lnk_infos\iShowCmd)
          psl\SetWorkingDirectory(@lnk_infos\sWorkingDir)
         
          If psl\QueryInterface(?IID_IPersistFile,@ppf)=#S_OK
            CompilerIf #PB_Compiler_Unicode
              ppf\Save(@link$,#True)
            CompilerElse
              sMemUnicode = Space(#MAX_PATH)
              MultiByteToWideChar_(#CP_ACP, #Null, lnk_infos\sShortcutFile, -1, sMemUnicode, Len(sMemUnicode))
              ppf\Save(@sMemUnicode,#True)
            CompilerEndIf
            result = #True
            ppf\Release()
          EndIf
          psl\Release()
        EndIf
        CoUninitialize_()
      EndIf
      ProcedureReturn result
      DataSection
        IID_IShellLink:
          CompilerIf #PB_Compiler_Unicode
            Data.l $000214F9
          CompilerElse
            Data.l $000214EE
          CompilerEndIf
          Data.w $0000,$0000
          Data.b $C0,$00,$00,$00,$00,$00,$00,$46
        CLSID_ShellLink:
          Data.l $00021401
          Data.w $0000,$0000
          Data.b $C0,$00,$00,$00,$00,$00,$00,$46
        IID_IPersistFile:
          Data.l $0000010b
          Data.w $0000,$0000
          Data.b $C0,$00,$00,$00,$00,$00,$00,$46
      EndDataSection
    EndProcedure
  ;}
  CompilerCase #PB_OS_Linux;{
    ;@author : Progi1984
    ;@doc : http://standards.freedesktop.org/desktop-entry-spec/latest/
    ProcedureDLL.l CreateShortcut(*shortcuts_infos.S_Shortcut)
      Protected lnk_infos.S_Shortcut
      Protected lFile.l, bType.b
     
      CopyMemory(*shortcuts_infos, @lnk_infos, SizeOf(S_Shortcut))
     
      lFile = CreateFile(#PB_Any, lnk_infos\sShortcutFile)
      If lFile
        If Right(lnk_infos\sFilename, 1) = "/"
          bType=3
        ElseIf FindString(lnk_infos\sFilename, "://",1) > 0
          bType=2
        Else
          bType=1
        EndIf
     
        WriteStringN(lFile, "[Desktop Entry]", #PB_UTF8)
        WriteStringN(lFile, "Version=1.0", #PB_UTF8)
        ; Desktop entry type
        Select bType
          Case 1 : WriteStringN(lFile, "Type=Application", #PB_UTF8)
          Case 2 : WriteStringN(lFile, "Type=Link", #PB_UTF8)
          Case 3 : WriteStringN(lFile, "Type=Directory", #PB_UTF8)
        EndSelect
        WriteStringN(lFile, "Name="+StringField(GetFilePart(lnk_infos\sShortcutFile),1,"."), #PB_UTF8)
        If lnk_infos\sDescription <> ""
          WriteStringN(lFile, "Comment="+lnk_infos\sDescription, #PB_UTF8)
        EndIf
        If lnk_infos\sIconPath <> ""
          WriteStringN(lFile, "Icon="+lnk_infos\sIconPath, #PB_UTF8)
        EndIf
        If lnk_infos\sWorkingDir <> ""
          WriteStringN(lFile, "Path="+lnk_infos\sWorkingDir, #PB_UTF8)
        EndIf
        Select bType
          Case 1
            WriteStringN(lFile, "TryExec="+lnk_infos\sFilename, #PB_UTF8)
            WriteStringN(lFile, "Exec="+lnk_infos\sFilename+" "+lnk_infos\sArgs, #PB_UTF8)
          Case 2
            WriteStringN(lFile, "URL="+lnk_infos\sFilename, #PB_UTF8)
        EndSelect
        CloseFile(lFile)
      EndIf
    EndProcedure
  ;}
CompilerEndSelect

Define.S_Shortcut filelink
CompilerSelect #PB_Compiler_OS
  CompilerCase #PB_OS_Windows ;{
    filelink\sFilename = "c:\windows\system32\calc.exe"
    filelink\sShortcutFile = "C:\Documents And Settings\flefevre\Bureau\Calculatrice.lnk"
  ;}
  CompilerCase #PB_OS_Linux ;{
    filelink\sFilename = "gedit"
    filelink\sShortcutFile = "/home/franklin/Bureau/mygedit.desktop"
  ;}
CompilerEndSelect

CreateShortcut(@filelink)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

...........................
Dernière modification par Backup le sam. 19/mars/2011 18:27, modifié 1 fois.
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Ouaip au final mon code intégre tout cela mais sans autant de commentaires que le tien (:D). De plus, il a l'avantage de fonctionner sous Windows & Linux.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Progi1984 a écrit :Ouaip au final mon code intégre tout cela mais sans autant de commentaires que le tien (:D). De plus, il a l'avantage de fonctionner sous Windows & Linux.
je dis pas que ton code est inutile :)

j'ai voulu profiter de ton topic pour ajouter un autre listing concernant ce sujet :) rien de plus ..
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Pas de pb !

Ca t'ennuie si j'utilise ton code pour améliorer le mien ?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

le code est de
; by Danilo, 09.12.2003
de toute façon tout code mis sur le forum est considéré comme libre :)
puisqu'il s'agit de mise a dispo du publique :)

donc pas de problemes :)
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Houla j'étais passé à coté de ces codes !
Merci beaucoup, ça peu servir !
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre