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 :

Connaitre le nom et le chemin d'une base Access ouverte


Sujet :

VB 6 et antérieur

  1. #1
    Invité
    Invité(e)
    Par défaut Connaitre le nom et le chemin d'une base Access ouverte
    Bonjour à tous

    Voilà donc mon petit soucis.

    Sur mon post je peux avoir plusieurs base Access d'ouvertes, ce que je souhaite c'est lister celles-ci.

    Je sais comment récupérer les processus ouverts (c'est dans la FAQ), mais cela signale qu'Access est ouvert, et non le fichier .mdb qui est ouvert dans Access et son chemin, c'est cela qui m’intéresse.

    Merci à ceux qui pourront m'apporter de l'aide.

    Philippe

  2. #2
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    Par défaut
    Salut

    Mes essais Avec Access 2007, 3 BDs ouvertes, j'obtiens bien les chemins et les noms des BDs.
    Un peu tiré par les cheveux, mais opérationnel.
    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
    Private Sub Command1_Click()
        Dim svc As Object
        Dim sQuery As String
        Dim oproc
     
        Dim Msg As String
        Dim MsgChemBDs As String
        Dim MsgBDs As String
        Dim TxtRech As String
     
        On Error GoTo Command1_Click_Error
     
        Set svc = GetObject("winmgmts:root\cimv2")
        sQuery = "select * from win32_process"
        For Each oproc In svc.execquery(sQuery)
            'Debug.Print oproc.Name & " = " & oproc.ExecutablePath
            If InStr(1, oproc.Name, "MSACCESS.EXE", vbTextCompare) <> 0 Then
                Msg = Trim(oproc.CommandLine)
                Msg = Replace(Msg, Chr(34), "")
                Msg = Replace(Msg, "]", "")
     
                MsgBDs = Right(Msg, Len(Msg) - InStrRev(Msg, "\"))
     
                TxtRech = "ShellOpenDatabase "
                If InStr(1, Msg, TxtRech, vbTextCompare) Then
                    MsgChemBDs = Right(Msg, (Len(Msg) - (InStrRev(Msg, TxtRech) + Len(TxtRech)) + 1))
                    Else
                    TxtRech = "NOSTARTUP "
                    MsgChemBDs = Right(Msg, (Len(Msg) - (InStrRev(Msg, TxtRech) + Len(TxtRech)) + 1))
                End If
                Debug.Print "Chemin de la BDs: " & MsgChemBDs
                Debug.Print "BDs:  " & MsgBDs
            End If
        Next
        Set svc = Nothing
        Exit Sub
     
    Command1_Click_Error:
        MsgBox "Error " & Err.Number & " (" & Err.Description & ")"
        Err.Clear
    End Sub
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci Francis

    Je testerais cela ce soir, et je te ferais mon retour.

    c'est quoi le type de oproc ?

    Philippe

  4. #4
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    Par défaut
    j'ai repris le code de la FAC, le fait est que cette variable n'est pas typé, mais avec Dim oproc As Object pas de problèmes.
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par ProgElecT Voir le message
    le fait est que cette variable n'est pas typé,
    Ce que je déteste, que je fasses du VB6, du Access, du Excel, la déclaration des variables et le typage est obligatoire pour moi

    Je regarde ce soir, il n'y a rien d'intéressant à la télé

  6. #6
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    Par défaut
    Citation Envoyé par Philippe JOCHMANS Voir le message
    ..........
    Je regarde ce soir, il n'y a rien d'intéressant à la télé



    Je viens de regarder, il manque la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                MsgChemBDs = Left(MsgChemBDs, Len(MsgChemBDs) - Len(MsgBDs) - 1)
    pour avoir le chemin sans le nom de la BDs.
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  7. #7
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 131
    Par défaut
    Bonjour,
    Citation Envoyé par Philippe JOCHMANS Voir le message
    Ce que je déteste, que je fasses du VB6, du Access, du Excel, la déclaration des variables et le typage est obligatoire pour moi

    Je regarde ce soir, il n'y a rien d'intéressant à la télé
    Ben, ce n'est pas parce que le typage n'est pas obligatoire qu'on est obligé de s'en passer
    d'autant qu'il est facile de l'identifier - le non typage est juste une "facilité" pour l'utilisateur lambda
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    .../...    Set svc = GetObject("winmgmts:root\cimv2")
    Debug.Print TypeName(svc)   ' => SWbemServicesEx
    et la référence correspondante
    «Microsoft WMI Scripting V.1.2 Library» (wbemdisp.tlb)

  8. #8
    Invité
    Invité(e)
    Par défaut
    Re

    Je crois que vous m'avez mal compris, cela donne le chemin de l'exe Access, ce que je souhaite c'est le chemine du fichier .mdb ouvert par Access.

    Merci

    Philippe

  9. #9
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    Par défaut
    J'ai bien compris, tout vient de la façon dont est ouvert la /les BDs.
    En ouvrant par un double clique sur le fichier .mdb, c'est bon
    Citation Envoyé par Fenêtre exécution
    Chemin de la BDs: C:\PersoFrancis\Constructeur de requetes
    BDs: BDpourEssais.mdb
    Chemin de la BDs: C:\PersoFrancis\Calcul OptimDecoupe\BaseMdb
    BDs: LocalProd.mdb
    Philippe, peux tu créer un espion sur la variable oproc, dans la boucle For Each, dans la fenêtre espion de VB6, lors du Stop (point d’arrêt), en développant Properties_ --> Item 2--> champs value, on peut lire par exemple:
    "C:\Program Files (x86)\Microsoft Office\Office12\MSACCESS.EXE" /NOSTARTUP "C:\PersoFrancis\Calcul OptimDecoupe\BaseMdb\LocalProd.mdb"

    Suite à verification:

    Si l'ouverture de la BDs est faite depuis/dans Microsoft Office Access, là
    Citation Envoyé par Fenêtre exécution
    Chemin de la BDs: m Files (x86)\Microsoft Office\Office12
    BDs: MSACCESS.EXE
    Dans tous les processus ouverts, le processus MSACCESS.EXE trouvé ne renvoie pas l'information.

    j'avais averti
    Un peu tiré par les cheveux, mais opérationnel.
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  10. #10
    Invité
    Invité(e)
    Par défaut
    Re

    Effectivement en ouvrant la base avec le double-clique cela fonctionne, mais pas en ouvrant Access d'abord, c'est ce que j'avais fait pour le test.

    C'est dommage, car l'ouverture peut se faire de deux manières.

    Je laisse ouvert la discussion pour l'instant.

    Philippe

  11. #11
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    Par défaut
    Juste pour te signaler que je suis sur une autre approche qui réussit a retrouver le titre de la fenêtre Access avec le nom de la BDs ouverte dans/depuis Microsoft Office Access.

    Je te posterai si cela permet de résoudre le problème.
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  12. #12
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    Par défaut
    Ben s'est pas très concluant .
    En ajoutant un module.bas avec ce
    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
    Option Explicit
     
    Declare Function EnumWindows Lib "User32" ( _
        ByVal wndenmprc As Long, ByVal lParam As Long) As Long
    Declare Function GetWindowText Lib "User32" Alias "GetWindowTextA" ( _
        ByVal hwnd As Long, _
        ByVal lpString As String, _
        ByVal cch As Long) As Long
     
    Public Sub Lister()
    'Demande à Windows d'énumérer les fenêtres ouvertes
    EnumWindows AddressOf EnumCallback, 0
    End Sub
    Public Function EnumCallback(ByVal app_hWnd As Long, ByVal param As Long) As Long
    Dim buf As String * 256
    Dim Titre As String
    Dim Longueur As Long
    Dim TxteRech As String
    Dim MsgExtract As String
     
    'Récupère le titre de la fenêtre
    Longueur = GetWindowText(app_hWnd, buf, Len(buf))
    Titre = Left$(buf, Longueur)
    TxteRech = "Microsoft Access - "
    If Trim$(Titre) <> "" Then
        'Vérifie si le titre de la fenêtre correspond au nom recherché
        If InStr(Titre, TxteRech) Then
            Titre = Trim$(Titre)
            Debug.Print Titre
            MsgExtract = Right(Titre, (Len(Titre) - (InStr(Titre, TxteRech) + Len(TxteRech))) + 1)
            MsgExtract = Left(MsgExtract, InStr(MsgExtract, " :") - 1)
            Debug.Print MsgExtract
        End If
    End If
    EnumCallback = 1 'Poursuit l'énumération
    End Function
    et dans Form1, un bouton avec ce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Command2_Click()
    Lister
    End Sub
    on obtient le/les noms des BDs en cours dans Microsoft Access, quelque soit l'ouverture (double clique et/ou Ouvrir avec dans l'explorateur, depuis le programme Access ouvrir une BDs et/ou Documents récents) mais ..... pas moyen de récupéré le chemin
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  13. #13
    Invité
    Invité(e)
    Par défaut
    Salut Francis

    Effectivement, pas de chemin, mais le nom du fichier.

    Il faut que je test un truc dans la journée, j'ai peut-être une idée.

    Philippe

  14. #14
    Invité
    Invité(e)
    Par défaut
    Bon je coince

    J'ai essayé avec un GetObject pour récupérer Access, à partir de là j'aurais le chemin du projet, mais

    Philippe

  15. #15
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 131
    Par défaut
    Effectivement tu auras le chemin complet avec database.name
    mais avec getobject tu n'auras que la 1ère instance ouverte.

    Il faut lister toutes les instances avec getrunningobjecttable
    mais c'est lourd.
    Bon courage.

  16. #16
    Invité
    Invité(e)
    Par défaut
    Salut à tous

    Bon je vous avoues que je sèche sur ce truc, j'ai trouvé un autre palliatif, c'est la création d'un complément Access qui sera donc accessible dans toutes les bases, et c'est même plus simple.

    Merci à tous de votre aide.

    Philippe

  17. #17
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 131
    Par défaut
    A l'occasion, quand j'aurais le temps, j'y reviendrais.
    Désolé de ne pouvoir m'y investir plus pour l'instant
    mais c'est assez lourd à développer.

  18. #18
    Invité
    Invité(e)
    Par défaut
    Re

    Citation Envoyé par DarkVader Voir le message
    mais c'est assez lourd à développer.
    Je m'en doute, comme c'est une petite application qui doit être utilisée pour plusieurs bases Access, le complément est le plus simple.

    Mais si tu trouves la solution je testerais sans soucis, et cela peut-être utile à d'autres.

    Philippe

  19. #19
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 131
    Par défaut
    Citation Envoyé par DarkVader Voir le message
    A l'occasion, quand j'aurais le temps, j'y reviendrais.
    Désolé de ne pouvoir m'y investir plus pour l'instant
    mais c'est assez lourd à développer.
    Ben c'est le moment lol

    Comme déjà dit précédemment, GetObject ne retourne que la 1ère instance trouvée ce qui est très limitant
    d'autant que GetObject devrait être appelé systématiquement avant chaque appel à CreateObject
    afin de vérifier si l'instance a créer n'est pas déjà ouverte.

    Voilà donc GetObjects de la librairie VB6i qui a le mérite de retourner TOUTES LES INSTANCES. Il suffira ensuite de faire le tri.
    Outre que c'est beaucoup moins lourd que la solution WMI qui est un pieux, cela retourne l'object Application.

    Un exemple avec des instances Excel, lancez 2 instances séparées de Excel (ou autre) et ouvrez plusieurs classeurs dans chaque instance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Sub F_Load()
        Dim xlObj() As Object, oWorkbook As Object, x As Long, sRet As String
     
        For x = 1 To GetObjects("Excel.Application", xlObj())
            For Each oWorkbook In xlObj(x).Workbooks
                sRet = sRet & IIf(sRet <> "", vbCrLf, "") & x & vbTab & oWorkbook.Name
            Next
        Next
     
    Debug.Print sRet
    End Sub

  20. #20
    Invité
    Invité(e)
    Par défaut
    Salut

    Merci pour ce retour qui pourrait servir à d'autres, mais je suis passé à un complément sur Access qui fonctionne parfaitement.

    Philippe

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Comment connaitre le nom et l'ip d'une machine en perl ?
    Par djibril dans le forum Téléchargez
    Réponses: 0
    Dernier message: 31/05/2011, 19h07
  2. Réponses: 3
    Dernier message: 17/07/2009, 15h47
  3. connaitre le nom du jour à partir d'une date
    Par com486 dans le forum Firebird
    Réponses: 4
    Dernier message: 18/05/2009, 11h27
  4. Réponses: 2
    Dernier message: 06/04/2007, 11h48

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