S'attacher à la console d'un process lancé avec CreateProcessA
Flocreate
Messages postés300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 2012
-
28 oct. 2010 à 19:52
cs_ghuysmans99
Messages postés3983Date d'inscriptionjeudi 14 juillet 2005StatutMembreDernière intervention30 juin 2013
-
30 oct. 2010 à 09:14
Bonjour,
Je tente une nouvelle manière de rediriger le flux d'une console dans une textebox
la méthode que j'essaye d'employer est celle-ci :
1) lancer la commande dans un nouveau processus avec CreateProcess
2) Attacher mon application à la console du nouveau processus
3) Recupérer les pointeurs de buffeurs de la console
4) Regarder les ajouts de lignes --> récupérer le texte
dont le code est celui-ci :
Commande = "CMD"
' CREER LE PROCESSUS
'-----------------------------------------
SA.nLength = LenB(SA)
SA.bInheritHandle = 0& '1&
SA.lpSecurityDescriptor = 0&
SI.cb = LenB(SI)
SI.dwFlags = STARTF_USESHOWWINDOW
SI.wShowWindow = 5 'SHOW
Dim res As Long
res = CreateProcess(0&, Commande, SA, SA, 1&, CREATE_NEW_CONSOLE, 0&, 0&, SI, PI)
'-----------------------------------------
Me.Caption = PI.dwProcessId & " - " & PI.dwThreadID
' ATTACHER CE PROCESSUS A LA CONSOLE
'-----------------------------------------
's'assurer de ne pas être déja attaché à une console
Call FreeConsole
'tenter de s'attacher a la dite console
Err.Clear
res = AttachConsole(PI.dwProcessId)
Select Case Err.LastDllError
Case 5: Me.Caption = "ERROR_ACCESS_DENIED"
Case 6: Me.Caption = "ERROR_INVALID_HANDLE"
Case 32: Me.Caption = "ERROR_GEN_FAILURE"
Case Else: Me.Caption = "NO ERROR"
End Select
'-----------------------------------------
Je sui bloqué à l'étape d'attachement à la console. En effet, le message d'erreur qui m'est renvoyé est "ERROR_ACCESS_DENIED". Je n'arrive pas a comprendre d'ou ca peut venir...
Si une personne a une idée, elle est la bienvenue.
A voir également:
S'attacher à la console d'un process lancé avec CreateProcessA
Flocreate
Messages postés300Date d'inscriptionlundi 17 juillet 2006StatutMembreDernière intervention27 mai 20123 29 oct. 2010 à 12:13
Bon ben il semblerait que finalement cela tourne mais uniquement quand on est en mode compilé (pas en Run)...
Nouveau problème, j'arrive à ecrire sur la console que je me suis attachée mais impossible de lire une personne connaissant les API console pourrait-elle me renseigner sur les obscures mystères ?
mon code :
Option Explicit
Private SA As SECURITY_ATTRIBUTES
Private SI As STARTUPINFO
Private PI As PROCESS_INFORMATION
Private Commande As String
Private Hout As Long
Private Hin As Long
Private Buff(99) As CHAR_INFO
Private S1 As COORD 'implicit tout 0
Private S2 As COORD 'implicit tout 0
Private SR As SMALL_RECT 'implicit tout 0
Private Sub Command1_Click()
Commande = "CMD"
' CREER LE PROCESSUS
'-----------------------------------------
SA.nLength = LenB(SA)
SA.bInheritHandle = 0& '1&
SA.lpSecurityDescriptor = 0&
SI.cb = LenB(SI)
SI.dwFlags = STARTF_USESHOWWINDOW
SI.wShowWindow = 10 'SHOW
Dim res As Long
res = CreateProcess(0&, Commande, SA, SA, 1&, CREATE_NEW_CONSOLE, 0&, 0&, SI, PI)
'-----------------------------------------
Me.Caption = PI.dwProcessId & " - " & PI.dwThreadID
End Sub
Private Sub Command2_Click()
's'assurer de ne pas être déja attaché à une console
Call FreeConsole
'tenter de s'attacher a la dite console
Err.Clear
Dim res As Long
res = AttachConsole(PI.dwProcessId)
Select Case Err.LastDllError
Case 5: Me.Caption = res & ") " & "ERROR_ACCESS_DENIED"
Case 6: Me.Caption = res & ") " & "ERROR_INVALID_HANDLE"
Case 32: Me.Caption = res & ") " & "ERROR_GEN_FAILURE"
Case Else: Me.Caption = res & ") " & "NO ERROR"
End Select
Hout = GetStdHandle(STD_OUTPUT_HANDLE)
Hin = GetStdHandle(STD_INPUT_HANDLE)
End Sub
Private Sub Command3_Click()
If (Hout <> 0) Then
Dim res As Long
Dim txt As String, nb As Long
txt = "coucou"
res = WriteConsole(Hout, txt, Len(txt), nb, 0&)
S1.x = 10
S1.y = 10
S2.x = 0
S2.y = 0
SR.Top = 0
SR.Left = 0
SR.Bottom = 1
SR.Right = 1
res = ReadConsoleOutputA(Hout, Buff(0), S1, S2, SR) '--> 0 - 87 (invalid parametter)
T.Text T.Text & "ReadConsoleOutput " & res & " - " & Err.LastDllError & vbCrLf
SR.Top = 0
SR.Left = 0
SR.Bottom = 1
SR.Right = 1
res = ReadConsoleOutputA(1&, Buff(0), S1, S2, SR) '--> 0 - 6 (bad handle)
T.Text T.Text & "ReadConsoleOutput " & res & " - " & Err.LastDllError & vbCrLf
End If
End Sub