Page 1 sur 2

[RESOLU] Créer un raccourci sur le bureau

Publié : ven. 22/juin/2018 23:48
par omega
Bonsoir à tous,

Avant de passer à la version Pb 5.62, j'utilisais très souvent PureFile_CreateLink pour créer un raccourci de mon programme par le biais d'un code d'installation (SETUP.EXE). C'est à dire, au niveau du code de la setup, je crée le raccourci. Tout marchait si bien. Depuis que j'utilise Pb 5.62, la création du raccourci ne marche plus. Est-ce à cause de PureFile qui est absolète? (A Noter que j'utilisais PureFile 4.30, je suppose que ça ne marche que sous Pb 4.30), j'ai cherché sur le forum une version supérieure mais je n'ai rien trouvé même l'ancienne version est absente. Sinon, y a t - il peut être un autre moyen de créer un raccourci d'un exécutable sur le bureau?
Voici un aperçu du code de PureFile qui permet de créer le raccourci

Code : Tout sélectionner

;Ajouter le raccourci dans le menu DEMARRER...
PathStart$ = GetSystemFolder (#CSIDL_STARTMENU) + "\Programmes\" + ProgName$ + ".lnk"
LinkFileName.s = PathStart$
FileLinkedTo.s =PathExe$
Arguments.s = ""
WorkingDirectory.s=PathInstal$
Description.s = ProgDesc$
ShowCommand.l = #SW_SHOWNORMAL
IconFile.s = FileLinkedTo
IconIndexInFile.l = 0
PureFILE_CreateLink(LinkFileName, FileLinkedTo, Arguments, Description, WorkingDirectory, ShowCommand, HotKey, IconFile, IconIndexInFile)

;Ajouter le raccourci sur le BUREAU...
PathStart$=GetSystemFolder (#CSIDL_DESKTOPDIRECTORY) + "\" + ProgName$ + ".lnk"
PathOnly$=GetPathPart(PathExe$)
LinkFileName.s = PathStart$
FileLinkedTo.s =PathExe$
Arguments.s = ""
WorkingDirectory.s=PathInstal$
Description.s = ProgDesc$
ShowCommand.l = #SW_SHOWNORMAL
IconFile.s = FileLinkedTo
IconIndexInFile.l = 0
PureFILE_CreateLink(LinkFileName, FileLinkedTo, Arguments, Description, WorkingDirectory, ShowCommand, HotKey, IconFile, IconIndexInFile)


Merci

Re: Créer un raccourci sur le bureau

Publié : sam. 23/juin/2018 8:14
par Ar-S
edit
mauvais lien

Sinon on peut pas tester si tu ne file pas le source.. il manque des fonctions dans ce que tu nous montres.

Re: Créer un raccourci sur le bureau

Publié : sam. 23/juin/2018 10:19
par falsam
Exemple testé avec PB 5.62. Commentaire dans le source.

Code : Tout sélectionner

EnableExplicit

Declare createShellLink(Application.s, LinkFileName.s, arg.s, desc.s, dir.s, icon.s, index)

Global Application.s, LinkFileName.s, LinkName.s, WorkDirectory.s

;Nom de l'executable : Exemple Demo.exe
Application = "D:\Purebasic Project\test\demo.exe"

WorkDirectory = GetPathPart(Application)

;Nom du raccourci à afficher sur le bureau
LinkFileName = GetHomeDirectory() + "desktop\" + "demo.lnk"

;Titre du raccourci 
LinkName = "Demo test"

;Création du raccourci sur le bureau
If createShellLink(Application, LinkFileName, "", LinkName, WorkDirectory, Application, 0) = 0
  MessageRequester("Information", "Le raccourci est crée sur le bureau", #PB_MessageRequester_Ok)
EndIf

;By Rashad (Forum anglophone)
Procedure createShellLink(Application.s, LinkFileName.s, arg.s, desc.s, dir.s, icon.s, index)
  ;Application - path to the exe that is linked to, lnk - link name, dir - working
  ;directory, icon - path to the icon file, index - icon index in iconfile
  Protected hRes.l, mem.s, ppf.IPersistFile
  CompilerIf #PB_Compiler_Unicode
    Protected psl.IShellLinkW
  CompilerElse
    Protected psl.IShellLinkA
  CompilerEndIf
  
  ;make shure COM is active
  CoInitialize_(0)
  hRes = CoCreateInstance_(?CLSID_ShellLink, 0, 1, ?IID_IShellLink, @psl)
  
  If hRes = 0
    psl\SetPath(Application)
    psl\SetArguments(arg)
    psl\SetDescription(desc)
    psl\SetWorkingDirectory(dir)
    psl\SetIconLocation(icon, index)
    
    ;query IShellLink for the IPersistFile interface for saving the
    ;link in persistent storage
    hRes = psl\QueryInterface(?IID_IPersistFile, @ppf)
    
    If hRes = 0
      ;CompilerIf #PB_Compiler_Unicode
      ;save the link
      hRes = ppf\Save(LinkFileName, #True)
      ppf\Release()
    EndIf
    psl\Release()
  EndIf
  
  ;shut down COM
  CoUninitialize_()
  
  DataSection
    CLSID_ShellLink:
    Data.l $00021401
    Data.w $0000,$0000
    Data.b $C0,$00,$00,$00,$00,$00,$00,$46
    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
    IID_IPersistFile:
    Data.l $0000010b
    Data.w $0000,$0000
    Data.b $C0,$00,$00,$00,$00,$00,$00,$46
  EndDataSection
  ProcedureReturn hRes
EndProcedure

Re: Créer un raccourci sur le bureau

Publié : sam. 23/juin/2018 11:36
par omega
Bonjour les pubistes et merci beaucoup pour vos réponses

@Ar-s
Je n'ai pas jugé nécessaire de fournir l'ensemble du code car il est volumineux et ensuite le problème résidait au niveau de la procédure que j'ai postée et qui consiste à créer un raccourci (la fonction CreateLink est prise en charge par PureFile 4.30 qui est déjà installé au niveau du dossier /Purebasic). J'ai extrait l'essentiel des variables du programme principal pour que tu puisses te retrouver sur leur signification mais n'essayes pas de tester le code car il n'est pas complet...

Code : Tout sélectionner

#CSIDL_PROGRAMS = $2 
#CSIDL_DESKTOPDIRECTORY = $10 
#CSIDL_PROGRAM_FILES = $26 
#CSIDL_SYSTEMX86 = $29 
 
Structure EMID 
    cb.b 
    abID.b[1] 
EndStructure 

;--------------------------------- PARAMETRES DU PROGRAMME A INSTALLER ------------------------------------------------
Global i,chemin$,PathInstal$,PathExe$,ProgName$,winTitre$,ProgDesc$,PathStart$,wmax,fileSys$,InstalDes$,wdos$

ProgName$="Pxmain"
ProgDesc$="Logiciel de gestion maintenance"
winTitre$="Installation du logiciel Pxmain - Gestion maintenance V.1 (2016)" 
fileSys$="wsysmn.ini" 
InstalDes$="INSTALLATION DU LOGICIEL Pxmain - Gestion maintenance V.1 (2016)" 

;--------------------------------------------------------------------------------------------------------------------------------
Procedure.s GetSystemFolder (folder) 
    *itemid.ITEMIDLIST = #Null 
    If SHGetSpecialFolderLocation_ (0, folder, @*itemid) = #NOERROR 
        location$ = Space (#MAX_PATH) 
        If SHGetPathFromIDList_ (*itemid, @location$) 
            ProcedureReturn location$ 
        EndIf 
    EndIf 
EndProcedure 

;-----------------------------------------------------------------------------
Procedure CreateIcone()
PathExe$=PathInstal$ + "\" + ProgName$ + ".exe"  

;Récupérer le chemin du menu demarrer + ajouter  le raccourci
PathStart$ = GetSystemFolder (#CSIDL_STARTMENU) + "\Programmes\" + ProgName$ + ".lnk"
LinkFileName.s = PathStart$
FileLinkedTo.s =PathExe$
Arguments.s = ""
WorkingDirectory.s=PathInstal$
Description.s = ProgDesc$
ShowCommand.l = #SW_SHOWNORMAL
IconFile.s = FileLinkedTo
IconIndexInFile.l = 0
PureFILE_CreateLink(LinkFileName, FileLinkedTo, Arguments, Description, WorkingDirectory, ShowCommand, HotKey, IconFile, IconIndexInFile)

;Récupérer le chemin du bureau + ajouter le raccourci
PathStart$=GetSystemFolder (#CSIDL_DESKTOPDIRECTORY) + "\" + ProgName$ + ".lnk"
PathOnly$=GetPathPart(PathExe$)
LinkFileName.s = PathStart$
FileLinkedTo.s =PathExe$
Arguments.s = ""
WorkingDirectory.s=PathInstal$
Description.s = ProgDesc$
ShowCommand.l = #SW_SHOWNORMAL
IconFile.s = FileLinkedTo
IconIndexInFile.l = 0
PureFILE_CreateLink(LinkFileName, FileLinkedTo, Arguments, Description, WorkingDirectory, ShowCommand, HotKey, IconFile, IconIndexInFile)

EndProcedure

PFilePath$ = GetSystemFolder (#CSIDL_PROGRAM_FILES) 
PathInstal$= PFilePath$ + "\" + ProgName$

CreateIcone()


@Falsam
Comme toujours, Je te remercie pour le partage car ton code marche très très bien. C'est en effet une solution qui va remplacer celle que j'utilisais auparavant.

Merci Falsam et bonne continuation

Re: [RESOLU] Créer un raccourci sur le bureau

Publié : sam. 23/juin/2018 14:41
par Marc56
Depuis Windows Vista, il existe une commande MKLINK qui permet de créer des raccourcis en ligne de commande
(Commande interne au shell, donc appel par cmd /c)

Forme de base: mklink nom_icone nom_programme

Code : Tout sélectionner

; Créer un raccourci sur le bureau avec MKLINK (Commande interne Windows Vista et +)
; 23/06/18 - Marc56
; 
; Syntaxe complete: mklink /?
; Create a symbolic link, hard Or soft link.

Program_Title$ = "PureBasic Beta"
Program_EXE$   = "C:\Program Files\PureBasicBeta\PureBasic.exe"

SetCurrentDirectory(GetUserDirectory(#PB_Directory_Desktop))

RunProgram("cmd", "/c mklink "      + 
                  #DQUOTE$          + 
                  Program_Title$    + 
                  #DQUOTE$          + 
                  " "               + 
                  #DQUOTE$          + 
                  Program_EXE$      + 
                  #DQUOTE$, 
           "")
Ici utilisation de quelques #DQUOTE$ si le titre de l'icône et/ou le chemin contient des espaces.

:wink:

Re: [RESOLU] Créer un raccourci sur le bureau

Publié : sam. 23/juin/2018 15:55
par Marc56
L'utilisation d'API directe (commandes suffixées _), ça fait "élite pro", mais pas forcément... les API ça bouge et il en existe plusieurs pour faire la même chose et pas toujours compatible d'une version à l'autre.

Ex: SHGetSpecialFolderLocation_
[SHGetSpecialFolderLocation is not supported and may be altered or unavailable in the future. Instead, use SHGetFolderLocation.]

Donc on ne les utilisent que si on ne peut pas faire autrement ou si ça va réellement plus vite.

Mieux vaut utiliser ce qui existe déjà dans PB et qui suivra les évolutions :wink:
Depuis PB 5.60 (ou 5.50?) GetUserDirectory() fournit une tartine de variables en plus compatibles 3 os.

Code : Tout sélectionner

GetUserDirectory(Type)
  #PB_Directory_Desktop    : Répertoire 'Bureau' de l'utilisateur connecté
  #PB_Directory_Downloads  : Répertoire 'Téléchargements' de l'utilisateur connecté
  #PB_Directory_Documents  : Répertoire 'Documents' de l'utilisateur connecté
  #PB_Directory_Pictures   : Répertoire 'Images' de l'utilisateur connecté
  #PB_Directory_Musics     : Répertoire 'Musiques' de l'utilisateur connecté  
  #PB_Directory_Videos     : Répertoire 'Videos' de l'utilisateur connecté
  #PB_Directory_Public     : Répertoire 'Documents Publics' de l'utilisateur connecté
  #PB_Directory_ProgramData: Répertoire des données stokées par les programmes de l'utilisateur connecté
                             Sous Linux et OSX, c'est le dossier 'home' suivi de '/.' pour pouvoir créer 
                             un répertoire de configuration caché par l'utilisateur connecté
  #PB_Directory_AllUserData: Répertoire de données des programmes communs (accessible à tous les utilisateurs)
  #PB_Directory_Programs   : Répertoire  des fichiers de programme globaux (lecture seule)
et aussi GetEnvironmentVariable() pour lequel on peut appeler path et le splitter avec StringFiled()

Pour connaitre toutes les variables d'env utilisateur, il suffit de taper SET dans une fenêtre "dos"

Thinks simple, think (pure)basic

:wink:

Re: [RESOLU] Créer un raccourci sur le bureau

Publié : sam. 23/juin/2018 16:01
par Kwai chang caine
@Marc56
Merci je ne connaissais pas cette combine 8)
Marc56 a écrit :Commande interne au shell, donc appel par cmd /c)
Ca veut dire quoi ça ? 8O
Aucun rapport avec le powershell ?

Re: [RESOLU] Créer un raccourci sur le bureau

Publié : sam. 23/juin/2018 16:11
par Marc56
Le "shell" est l'interpréteur de commande
Sous DOS, Windows 3.x, 9.x c'était command.com
Sous NT c'est CMD.EXE
mais il y en a d'autres 4DOS, Ndos, TCC

Le "shell" contient des commandes internes (dir, rd, md, del... et maintenant mklink)
il n'existe pas de "dir.exe", "rd.exe" etc
Les commandes internes ne peuvent donc pas êtres appelées directement par un RunProgram, il faut appeler le shell, puis lui dire de d'appeler une commande.

cmd /c dir

/c, la commande s'éxécutre puis, la fenêtre "dos" se ferme
/k elle reste ouverte après.

Donc pour faire un "dir" sous PB il faut faire

Code : Tout sélectionner

RunProgram("cmd", "/c dir", "")
Unix/Linux n'est pas pareil, la plupart des commandes usuelles sont des programmes à part entière (ls, ln, rmdir, mkdir etc), on peut donc les appeler directement

:mrgreen: Oui, aucun rapport avec le "bidule" powershell
Heureusement que MS a enfin eut une bonne idée avec le WSL
:wink:

Re: [RESOLU] Créer un raccourci sur le bureau

Publié : sam. 23/juin/2018 16:38
par Kwai chang caine
Merci beaucoup de cette explication, je comprend le commutateur /C maintenant 8)
Pour le reste je connaissais, car je suis un dinosaure, et j'ai commencé à tripoter mon premier PC avec un portable 286 epson...W3.1 ça fait rêver :lol:
A l'époque on avait encore un vrai DOS en sous système 8)
Oui pour le powershell j'ai cru comprendre que c'était une nouvelle mouture du DOS, plus puissante, plus pratique, plus moderne, "pluceMieuBien" quoi 8)
Je redoute le moment ou ils supprimeront le pseudo DOS pour qu'il n'y ai plus que le PowerShell :|

Re: [RESOLU] Créer un raccourci sur le bureau

Publié : sam. 23/juin/2018 17:16
par Marc56
Dinosaure aussi, j'ai commencé ma vie "PC" avec Ms-Dos / Dr-Dos puis Windows 2 (qui s’appelait Windows 286 puis Windows 386 et pouvait même être utilisé en runtime avec une disquette 5"1/4 1.2Mo) puis Windows 3.0, 3.1 etc.

Powershell ne remplacera pas cmd, il voudrait, mais c'est imbuvable pour les trucs rapides. C'est du pure POO (ça fait plaisir à certains, mais même pas sur).
À noter que c'est ce qui fonctionne en sous-main pour faire tourner une partie des accessoires windows (avec une gui par dessus)

C'est plutôt le shell Linux (Bash) qui a de l'avenir sous Windows grâce au WSL (sous système linux).
Ex: Lancer notepad depuis linux:

Code : Tout sélectionner

~ $ /mnt/c/Windows/notepad.exe &
C'est fun et bien mieux que les portages de bash ou cygwin.
Et depuis la mise à jour 1803 de Windows 10, on peut enfin lancer des daemons linux (= services) dans le WSL et ils ne s'arrêtent pas à la fermeture du shell. (équivalent donc du NOHUP linux)

Windows va-t-il être le fédérateur des (300) distris Linux :?: :mrgreen:
Le noyau Linux est meilleur, les outils shell aussi mais la GUI Windows est bien plus élaborée que tous les gestionnaires Linux

:wink:

Re: [RESOLU] Créer un raccourci sur le bureau

Publié : sam. 23/juin/2018 20:05
par Kwai chang caine
Du LINUX dans Windows !!! alors ça non plus je savais pas 8O
Bon bah, tu me rassure pour la fin du pseudo dos, car si en plus powershell est POO...Kaï kaï kaï, :| ou plutôt Kwaï Kwaï Kwaï serait plus approprié :mrgreen:
Et ben, encore merci de tout ces "explicages" forts intéressants 8)

Re: [RESOLU] Créer un raccourci sur le bureau

Publié : dim. 24/juin/2018 10:11
par Micoute
C'est un peu fade, tu peux me passer le SHELL ?

Re: [RESOLU] Créer un raccourci sur le bureau

Publié : dim. 24/juin/2018 11:22
par Ollivier
(Petite parenthèse)
Le "shell" contient des commandes internes (dir, rd, md, del...et maintenant mklink)
il n'existe pas de "dir.exe", "rd.exe" etc
A noter que dans les 1ères versions, il y a bien longtemps, ces commandes, guidées par un répertoire de commande spécifié à l'amorçage existait en tant que programme à part entière. On pouvait trouver ce répertoire et y figuraient une liste comme ceci :

Code : Tout sélectionner

.         [DIR]
..        [DIR]
DIR      COM
COPY     COM
CHDIR    COM
RMDIR    COM
MKDIR    COM
... Et autres commandes...

(Fin de parenthèse)

Créer un raccourci sur le bureau

Publié : mar. 17/juil./2018 21:04
par omega
@FALSAM
Je croyais que ce problème était réglé, car j'ai testé ton code et quand j'ai vu le raccourci affiché sur le bureau je pensais que c'était bon car ce n'est que ce jour que j'ai remarqué quelque chose qui ne va pas:
Quand on clique sur le raccourci, normalement, c'est le programme cible qui devait s'exécuter, alors qu'ici, c'est le raccourci lui même qui s'exécute (comme si c'était une application). Anormal n'est ce pas??
Merci

Re: Créer un raccourci sur le bureau

Publié : mer. 18/juil./2018 15:18
par falsam
omega a écrit :Quand on clique sur le raccourci, normalement, c'est le programme cible qui devait s'exécuter, alors qu'ici, c'est le raccourci lui même qui s'exécute (comme si c'était une application). Anormal n'est ce pas??
Je ne comprends pas de quoi tu parles.

Si je crée un raccourci d'une application c'est bien l'application qui est lancé.

Avec cette exemple que d'autres utilisateurs pourront tester, je crée sur le bureau un raccourci de l'application PureBasic.

■ Comment je procéde ?

Code : Tout sélectionner

;Nom de l'executable : Exemple Demo.exe
Application = #PB_Compiler_Home + "/PureBasic.exe"

;Nom du raccourci à afficher sur le bureau
LinkFileName = GetHomeDirectory() + "desktop\" + "PureBasic.lnk"

;Titre du raccourci 
LinkName = "Pure Basic IDE"
■ Le code complet que tu peux tester

Code : Tout sélectionner

EnableExplicit

Declare createShellLink(Application.s, LinkFileName.s, arg.s, desc.s, dir.s, icon.s, index)

Global Application.s, LinkFileName.s, LinkName.s

;Nom de l'executable : Exemple Demo.exe
Application = #PB_Compiler_Home + "/PureBasic.exe"

;Nom du raccourci à afficher sur le bureau
LinkFileName = GetHomeDirectory() + "desktop\" + "PureBasic.lnk"

;Titre du raccourci 
LinkName = "Pure Basic IDE"

;Création du raccourci sur le bureau
If createShellLink(Application, LinkFileName, "", LinkName, "", Application, 0) = 0
  MessageRequester("Information", "Le raccourci est crée sur le bureau", #PB_MessageRequester_Ok)
EndIf

;By Rashad (Forum anglophone)
Procedure createShellLink(Application.s, LinkFileName.s, arg.s, desc.s, dir.s, icon.s, index)
  ;Application - path to the exe that is linked to, lnk - link name, dir - working
  ;directory, icon - path to the icon file, index - icon index in iconfile
  Protected hRes.l, mem.s, ppf.IPersistFile
  CompilerIf #PB_Compiler_Unicode
    Protected psl.IShellLinkW
  CompilerElse
    Protected psl.IShellLinkA
  CompilerEndIf
  
  ;make shure COM is active
  CoInitialize_(0)
  hRes = CoCreateInstance_(?CLSID_ShellLink, 0, 1, ?IID_IShellLink, @psl)
  
  If hRes = 0
    psl\SetPath(Application)
    psl\SetArguments(arg)
    psl\SetDescription(desc)
    psl\SetWorkingDirectory(dir)
    psl\SetIconLocation(icon, index)
    
    ;query IShellLink for the IPersistFile interface for saving the
    ;link in persistent storage
    hRes = psl\QueryInterface(?IID_IPersistFile, @ppf)
    
    If hRes = 0
      ;CompilerIf #PB_Compiler_Unicode
      ;save the link
      hRes = ppf\Save(LinkFileName, #True)
      ppf\Release()
    EndIf
    psl\Release()
  EndIf
  
  ;shut down COM
  CoUninitialize_()
  
  DataSection
    CLSID_ShellLink:
    Data.l $00021401
    Data.w $0000,$0000
    Data.b $C0,$00,$00,$00,$00,$00,$00,$46
    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
    IID_IPersistFile:
    Data.l $0000010b
    Data.w $0000,$0000
    Data.b $C0,$00,$00,$00,$00,$00,$00,$46
  EndDataSection
  ProcedureReturn hRes
EndProcedure
j'ai regardé le gestionnaire de tache. C'est bien l'environnement de PureBasic qui est chargé.