Lancer un fichier avec son programme par defaut sans shellexecute

Soyez le premier à donner votre avis sur cette source.

Vue 10 715 fois - Téléchargée 495 fois

Description

J'ai ecrit ce bout de code pcq sheelExecute m'a saoulé en me retournant un code 42 qui correspond à dieu seul sait koi...bref il y avait un processus qui tourner mais rien...donc voila ce code ki marche relativement bien...enfin vous me direz...
Je me sert des associations dans la base de registre.
A priori ca marche sur tous les systemes.(Windows bien entendu)

Source / Exemple :


Private Sub Command1_Click()
    Dim extension As String
    Dim pos As Integer
    Dim tmp1 As String
    Dim tmp2 As String
    
    pos = InStrRev(TextFichier.Text, ".")
    extension = Right(TextFichier.Text, Len(TextFichier.Text) - pos + 1)
    Debug.Print "extension :" & extension
    tmp1 = LireValeur(HKeyClassesRoot, extension, "")
    tmp2 = LireValeur(HKeyClassesRoot, tmp1 & "\shell\open\command", "")

    tmp2 = Replace(tmp2, "%SystemRoot%", WinDirectory)
    tmp2 = Replace(tmp2, Chr(34) & "%1" & Chr(34), Chr(34) & TextFichier.Text & Chr(34))
    tmp2 = Replace(tmp2, "%1", Chr(34) & TextFichier.Text & Chr(34))
    
    Debug.Print tmp1
    Debug.Print tmp2
    ret = Shell(tmp2, vbNormalFocus)
    
End Sub

'Quelques déclarations utiles pour lire la base de registre
'pris sur VBfrance

Const HKEY_CLASSES_ROOT = &H80000000
Const HKEY_CURRENT_USER = &H80000001
Const HKEY_LOCAL_MACHINE = &H80000002
Const HKEY_USERS = &H80000003
Const HKEY_DYN_DATA = &H80000004

Public Enum HCle
    HKeyLocalMachine = 0
    HKeyCurrentUser = 1
    HKeyClassesRoot = 2
    HKeyUsers = 3
    HKeyDynamicData = 4
End Enum

'pour créer ou ouvrir une clé
Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" _
    (ByVal HKey As Long, _
     ByVal lpSubKey As String, _
     phkResult As Long) As Long
     
'pour lire une valeur
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" _
    (ByVal HKey As Long, _
     ByVal lpValueName As String, _
     ByVal lpReserved As Long, _
     lpType As Long, _
     lpData As Any, _
     lpcbData As Long) As Long

Public Function LireValeur(HK As HCle, Chemin As String, Valeur As String) As String
    Dim lng As Long
    Dim Buff As Long
    
    Buff = 0
    Buff = RegCreateKey(HKConvert(HK), Chemin, lng)
    If Buff = 0 Then RegQueryValueEx lng, Valeur, 0&, 1, 0&, Buff
    If Buff < 2 Then
        LireValeur = ""
        Exit Function
    End If
    LireValeur = String(Buff + 1, " ")
    RegQueryValueEx lng, Valeur, 0&, 1, ByVal LireValeur, Buff
    LireValeur = Left(LireValeur, Buff - 1)
End Function

Private Function HKConvert(ByVal HK As HCle) As Long
    If HK = 2 Then HKConvert = HKEY_CLASSES_ROOT
    If HK = 1 Then HKConvert = HKEY_CURRENT_USER
    If HK = 0 Then HKConvert = HKEY_LOCAL_MACHINE
    If HK = 3 Then HKConvert = HKEY_USERS
    If HK = 4 Then HKConvert = HKEY_DYN_DATA
End Function

Conclusion :


Dites moi ce ke vous en pensez et si ca marche chez vous

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_DARKSIDIOUS
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
81 -
C'est vrai que c'est bien pensé, et permet de lancer le programme associé à un fichier sans passer par la fonction ShellExecute... mais bon, je n'ai pas encore rencontré de problème avec cette API ;-)

9/10 pour l'originalité ;-p

DarK Sidious
cs_Jack
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
61 -
Tu te plains que ShellExecute ne te renvoie que le code 42 au lieu du HWnd de l'application lancée, mais tu ne le récupères pas dans ton appli !
Solution :
Au lieu de faire le "Private Sub Command1_Click()", crée ta propre fonction en "Private Function LanceProg (ByVal Fichier as String) as Long"
et dans cette fonction, après le Ret = Shell, tu fais simplement :
LanceProg = Ret
En plus, il faudra remplacer TextFichier.Text par Fichier dans la fonction
Pour l'utiliser :
Hwnd = LanceProg (TextFichier.Text)

Vala.
Jack
cs_goth
Messages postés
82
Date d'inscription
lundi 23 décembre 2002
Statut
Membre
Dernière intervention
23 août 2005
-
Dark Sidious=> thx

Jack => je me fous du hwnd de l'appli lancée(tte facon si t'a le pid c pas un pb). Mon pb avec shellExecute est que si je me sers du "mot" open avec par exemple un fichier txt, il me retourne un code 42 (donc pas un code d'erreur car>32), mais il ne me lance pas notepad (du moins en visible, vu kil apparait simplement dans la liste des processus).
La je me sers de shell et je n'ai aucun pb.

Vala.
Goth
koj55
Messages postés
1
Date d'inscription
dimanche 8 août 2004
Statut
Membre
Dernière intervention
30 octobre 2004
-
ShellExecute fonctionne très bien.
Il ne faut simplement pas oublier de mettre le nShowCmd à SW_SHOWNORMAL.
Si tu laisse 0 cela correspond à SW_HIDE !!! Le processus est lancé mais invisible...
cs_cocolou
Messages postés
1
Date d'inscription
jeudi 11 novembre 2004
Statut
Membre
Dernière intervention
11 novembre 2004
-
Pour moi tout se passe bien sauf que les fichiers de type modèle ([xlt] pour EXCEL, [dot] pour WORD, etc.) ne donnent pas le résultat attendu.

En effet, c'est le fichier modèle lui-même qui est ouvert alors que je souhaite qu'une nouvelle instance du modèle soit ouverte dans un nouveau document.

Merci pour ta (vos) réponse(s).

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.