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

Macros et VBA Excel Discussion :

[Windows API] AttachConsole 64 bits ne fonctionne pas


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Octobre 2018
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 216
    Par défaut [Windows API] AttachConsole 64 bits ne fonctionne pas
    Bonjour,

    Je ne comprends pas pourquoi je n'arrive pas à attacher une console Windows externe (s'appelant "Command Prompt") que j'ai bien évidemment préalablement ouverte.


    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
     
    Option Explicit
     
    Private m_StdError   As LongPtr
    Private m_StdInput   As LongPtr
    Private m_StdOutput As LongPtr
     
    Declare PtrSafe Function AttachConsole Lib "kernel32" (ByVal ProcessID As Long) As Boolean
    Declare PtrSafe Function FreeConsole Lib "kernel32" () As Long
    Declare PtrSafe Function CloseHandle Lib "kernel32" (ByVal hObject As LongPtr) As Long
     
    Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
    Declare PtrSafe Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As LongPtr, lpdwProcessId As Long) As Long
     
    '
    Sub test()
     
        Dim lHwnd As LongPtr, lPID As Long
     
        lHwnd = FindWindow(lpClassName:="ConsoleWindowClass", lpWindowName:="Command Prompt")
     
        GetWindowThreadProcessId hwnd:=lHwnd, lpdwProcessId:=lPID
     
        Debug.Print AttachConsole(ProcessID:=lPID) ' <- échoue, malgré un lPID vailide
     
        CloseHandle hObject:=m_StdOutput
        CloseHandle hObject:=m_StdInput
        FreeConsole
     
    End Sub
    Avez-vous une idée d'où vient le problème ?

    Ps : j'utilise Excel 64 bits et il y aurait visiblement des différences avec la version 32 bits, en plus des adresses mémoires plus longues.

    Merci par avance !

  2. #2
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    Bonjour,

    Que vaut err.lastdllerror ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Octobre 2018
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 216
    Par défaut
    Bonjour,

    J'obtiens Err.LastDllError = 87 qui de ce je comprends correspond à INVALID_PARAMETER (je ne suis pas très sûr, car je n'ai pas encore trouvé la définition des erreurs). Ce qui aurait effectivement du sens...

    Ps : j'ai aussi trouvé ce site https://www.motobit.com/help/scptutl/clu48.htm qui suggère de passer par la libraire ScptUtl.dll pour manipuler les process. Ca me laisse quelque peu perplexe et, je préférerais éviter d'avoir recours à des librairies externes "non-standard".

  4. #4
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    Bonjour,

    J'ai essayé mais je ne reproduis pas l'erreur.

    Quel est l'objectif ?
    La fenêtre de commande est-elle lancée par la même application ?

    ScptUtl.dll je ne connais pas mais quitte à faire appel à une librairie externe on peut :
    - utiliser les api createProcess, createPipe, … mais ce n'est pas facile.
    - utiliser WScript.Shell (ça du Microsoft) qui permet de récupérer les stdOut et stdErr.

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Octobre 2018
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 216
    Par défaut
    En fait, je pilote une appication externe en VBA. Il s'avère qu'il y ait une console Windows associée à l'application où il y figure des informations qui me sont utiles (bon OK j'avoue c'est aussi pour le fun ). Il ne s'agit pas d'une console interactive, mais juste d'une console qui affiche le status de la configuration.

    J'ai finalement réussi à attacher la console sous VBA en 32 bit (je ne sais pas exactement la version de VBA, car il ne s'agit pas d'Office, mais de CATIA qui est un logiciel de CAO).

    Je verrai pour Office 64 bit ultérieurement, car c'est toujours bien de comprendre...

    Ps : j'avais également lancé une discussion à ce lien https://www.developpez.net/forums/d1...nsole-windows/ . Après bon nombre de bidouilles, ça (semble) fonctionne parfaitement. Résultat, je n'ai plus qu'à sérieusement lire la doc Microsoft )/

Discussions similaires

  1. Réponses: 0
    Dernier message: 28/06/2017, 10h04
  2. [AC-2013] Agenda 32 Bits ne fonctionne pas sur nouveau PC AC 2013 64 Bits
    Par MONANGE dans le forum VBA Access
    Réponses: 1
    Dernier message: 22/12/2016, 19h26
  3. [Lazarus] Lazarus 1.6 ne fonctionne pas après l'installation sous Windows 7 64 bits
    Par aimer_Delphi dans le forum Lazarus
    Réponses: 30
    Dernier message: 24/08/2016, 18h34
  4. window.resizeTo ne fonctionne pas avec firefox?
    Par FrankOVD dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/06/2005, 15h07
  5. [WINDOWS CE]WriteProfileString ne fonctionne pas
    Par protonos dans le forum MFC
    Réponses: 17
    Dernier message: 13/05/2005, 19h58

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