IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

[VB6] Localiser un dossier spécial de Windows


Sujet :

VB 6 et antérieur

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 21
    Points : 11
    Points
    11
    Par défaut [VB6] Localiser un dossier spécial de Windows
    Bonjour,
    J'ai besoin de localiser le dossier "c:\program files" de l'utilisateur, quelque soit sa version Windows. Pour cela, ne trouvant pas d'exemple sur ce site utilisant l'API SHGetSpecialFolderLocation, j'ai cherché sur le net et trouvé plein d'exemples ; mais il semblerait que la source soit la même. Aucun des exemples testés ne fonctionne :oops: . Je développe sous Windows 98 et n'ai rien trouvé à ce sujet dans le WIN32 API de Daniel Appleman. Autre question : mon bouquin est peut-être un peu vieux. Qu'est-ce qu'il y a de mieux actuellement qui traite des API (aglais ou français) ?

  2. #2
    HPJ
    HPJ est déconnecté
    Membre averti

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2003
    Messages : 260
    Points : 364
    Points
    364
    Par défaut
    Citation Envoyé par Rohan Michel
    Aucun des exemples testés ne fonctionne.
    Quelle est l'erreur :

    Tu as cherché dans la FAQ : http://vb.developpez.com/faq/?page=Systeme#rep_speciaux
    Sinon fais une recherche de l'API sur http://msdn.microsoft.com
    Avant de poser une question, merci de chercher dans les rubriques suivantes:
    FAQ VB
    Tutoriaux VB
    Recherche avancée sur le forum

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 21
    Points : 11
    Points
    11
    Par défaut Localisation des dossiers spéciaux
    Je n'ai pas d'erreur à proprement parler, mais le résultat escompté n'est pas au rendez-vous (pas plus de succès avec le script qui se trouve sur ce site). Pour les paramètres suivants, les seuls dossiers spéciaux que j'obtiens sont les suivants. Les autres restent désespérement vides, comme si "C:\Program Files" n'était pas un dossier spécial.
    Pas encore consulté le site de Microsoft. Cet APM.

    2 - C:\WINDOWS\Menu Démarrer\Programmes
    5 - D:\Mes documents
    6 - C:\WINDOWS\Favoris
    7 - C:\WINDOWS\Menu Démarrer\Programmes\Démarrage
    8 - C:\WINDOWS\Recent
    9 - C:\WINDOWS\SendTo
    11 - C:\WINDOWS\Menu Démarrer
    16 - C:\WINDOWS\Bureau
    19 - C:\WINDOWS\Voisinage réseau
    20 - C:\WINDOWS\FONTS
    21 - C:\WINDOWS\ShellNew
    26 - C:\WINDOWS\Application Data
    27 - C:\WINDOWS\PrintHood
    32 - C:\WINDOWS\Temporary Internet Files
    33 - C:\WINDOWS\Cookies
    34 - C:\WINDOWS\Historique
    Remerciements

  4. #4
    HPJ
    HPJ est déconnecté
    Membre averti

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2003
    Messages : 260
    Points : 364
    Points
    364
    Par défaut
    http://msdn.microsoft.com/library/de...nums/csidl.asp
    CSIDL_PROGRAM_FILES 0x0026 soit 38 en décimal.
    Avant de poser une question, merci de chercher dans les rubriques suivantes:
    FAQ VB
    Tutoriaux VB
    Recherche avancée sur le forum

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 21
    Points : 11
    Points
    11
    Par défaut Localiser un dossier spécial
    J'ai testé à l'aide d'une boucle tous les codes de 1 à 100.000, dont le 38. Seuls les paramètres que j'ai mentionnés ci-dessus me renvoient des valeurs de dossiers spéciaux ; le 38 me renvoit une chaîne vide au lieu du "c:\Program Files" attendu. Pas trouvé de solution avec les API, je vais scruter la base de registre avec GetAllSettings. :cry:

  6. #6
    HPJ
    HPJ est déconnecté
    Membre averti

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2003
    Messages : 260
    Points : 364
    Points
    364
    Par défaut
    Chez moi ce code fonctionne bien...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    ' dans une form...
    Private Declare Function SHGetSpecialFolderPath Lib "shell32.dll" Alias "SHGetSpecialFolderPathA" _
                                                    (ByVal hwndOwner As Long, ByVal lpszPath As String, _
                                                     ByVal nFolder As Long, ByVal fCreate As Long) As Long
     
    Public Function GetSpecialFolderPath(dossier As Long, hwnd As Long)
     
        Dim buffer As String
     
        buffer = Space(256)
        SHGetSpecialFolderPath hwnd, buffer, dossier, 0
        GetSpecialFolderPath = Left(buffer, InStr(buffer, Chr(0)) - 1)
     
    End Function
     
    Private Sub Form_Load()
     
        MsgBox GetSpecialFolderPath(38, Me.hwnd)
     
    End Sub
    Si ça ne fonctionne pas, quelle est ta version de windows :
    Avant de poser une question, merci de chercher dans les rubriques suivantes:
    FAQ VB
    Tutoriaux VB
    Recherche avancée sur le forum

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 21
    Points : 11
    Points
    11
    Par défaut Essai non concluant
    Merci infiniment d'avoir pris le temps de tester ce programme sur votre machine. Sur la mienne je n'ai qu'une chaîne vide en retour. Si vous êtes sous NT, 2000 ou XP, il est possible que la cause en soit le système d'exploitation. Mais si vous êtes sous Windows 98, je donne ma langue au chat après 3j de recherche.

  8. #8
    HPJ
    HPJ est déconnecté
    Membre averti

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2003
    Messages : 260
    Points : 364
    Points
    364
    Par défaut
    Je suis sous Windows 2000.
    Une autre fonction de l'API...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Private Declare Function SHGetFolderPath Lib "shell32.dll" Alias "SHGetFolderPathA" _
                                                    (ByVal hwndOwner As Long, ByVal nFolder As Long, _
                                                     ByVal hToken As Long, ByVal dwFlags As Long, ByVal lpszPath As String) As Long
     
    Public Function GetFolderPath(dossier As Long, hwnd As Long)
     
        Dim buffer As String
     
        buffer = Space(256)
        SHGetFolderPath hwnd, dossier, 0, 0, buffer
        GetFolderPath = Left(buffer, InStr(buffer, Chr(0)) - 1)
     
    End Function
     
    Private Sub Form_Load() 
     
        MsgBox GetFolderPath(38, Me.hwnd) 
     
    End Sub
    Citation Envoyé par MSDN
    CSIDL_PROGRAM_FILES (0x0026)
    Version 5.0. The Program Files folder. A typical path is C:\Program Files.
    Il faut Internet Explorer 5 ou plus...
    Avant de poser une question, merci de chercher dans les rubriques suivantes:
    FAQ VB
    Tutoriaux VB
    Recherche avancée sur le forum

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 21
    Points : 11
    Points
    11
    Par défaut Localisation des dossiers spéciaux
    Cette fois j'obtiens une erreur (1) qui semblerait confirmer (???) que le système d'exploitation est bien en cause ; mais comme cette API n'est pas très bien renseignée sur le site de Microsoft, comment en être certain ? Peut-être faudra-t-il que j'essaye sur une station en Windows 2000.
    Si c'est le cas, il faut fuir SHGetFolderPath au pas de course, non ?

    (1) Erreur 453 : Point d'entrée SHGetFolderPathA d'une DLL introuvable dans shell32.dll
    Je suis sous I.E. 6.0

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 21
    Points : 11
    Points
    11
    Par défaut Localiser "c:\Program Files"
    En fin de compte c'est moins vaseux en piquant directerment dans la base de registre. Je vous en livre le code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    Option Explicit
     
    Const DERNIER_ITEM = 259&
    Const Key_CURRENT_CONFIG = &H80000005
    Const Key_LOCAL_MACHINE = &H80000002
    Const BUFFER = &HFF&
     
    Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal Key As Long) As Long
    Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal Key As Long, ByVal lpSubKey As String, phkRetour As Long) As Long
    Private Declare Function RegEnumKeyEx Lib "advapi32.dll" Alias "RegEnumKeyExA" (ByVal Key As Long, ByVal dwIndex As Long, ByVal lpName As String, lpcbName As Long, ByVal lpReserved As Long, ByVal lpClass As String, lpcbClass As Long, lpftLastWriteTime As Any) As Long
    Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal Key As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
     
    Private Sub Form_Load()
      Dim Entrée As String
      Dim Sortie As String
     
      ' Il faut impérativement connaître la valeur en entrée
      Entrée = "ProgramFilesDir"
      Sortie = RegExtract(Entrée)
      MsgBox Sortie : end
    End Sub
     
    Function RegExtract(ByVal Entrée As String) As String
      Dim Clé As Long, Compteur As Long, Len_In As Long, Len_Out As Long
      Dim Str_In As String, Str_Out As String
     
      If RegOpenKey(Key_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion", Clé) = 0 Then
        'initialisation
        Str_In = Space(BUFFER): Str_Out = Space(BUFFER)
        Len_In = BUFFER: Len_Out = BUFFER
     
        'On scrute toutes les lignes
        While RegEnumValue(Clé, Compteur, Str_In, Len_In, 0, ByVal 0&, ByVal Str_Out, Len_Out) <> DERNIER_ITEM
          If Len_Out > 0 And Left$(Str_In, Len_In) = Entrée Then
            RegExtract = Left$(Str_Out, Len_Out - 1)
          End If
          Compteur = Compteur + 1
          Str_In = Space(BUFFER)
          Str_Out = Space(BUFFER)
          Len_In = BUFFER
          Len_Out = BUFFER
        Wend
        'Fermer la clé du registre
        RegCloseKey Clé
      Else
        MsgBox " Erreur à l'ouverture de la clé du registre."
      End If
    End Function

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 21
    Points : 11
    Points
    11
    Par défaut FIN
    Merci pour tout HPJ

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB6] CommonDialog et dossier
    Par spikto dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 05/06/2006, 14h59
  2. [VB6]lister les dossiers et sous dossier
    Par Jacen dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 28/04/2006, 08h06
  3. [VB6] Copier un dossier en fonction d'un autre
    Par Sytchev3 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 10/04/2006, 16h39
  4. [VB6]un quart de seconde avec l'horloge windows
    Par méphistopheles dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 09/01/2006, 09h57
  5. [VB6] Forçage de la priorité d'un processus Windows
    Par okyle dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 01/06/2004, 11h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo