Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

lancer un programme DOS et recevoir le texte dans un programme VB

3 réponses
Avatar
David
Bonjour à tous,

Après avoir lancer et utiliser un programme DOS
j'essaye de recevoir le texte affiché dans un programme VB6.
Pensez-vous que cela soit possible et si oui comment ?
Merci d'avance.

--
a+ Jean-Pol
Site Web : www.colovid.be
Site Web perso pour le fun : http://users.skynet.be/DAVID/

3 réponses

Avatar
Jean-marc
David wrote:
Bonjour à tous,

Après avoir lancer et utiliser un programme DOS
j'essaye de recevoir le texte affiché dans un programme VB6.
Pensez-vous que cela soit possible et si oui comment ?
Merci d'avance.



Hello,

c'est non seulement possible mais en plus très simple et très
couramment utilisé.
L'idée : lancer le programme Dos depuis VB, via un fichier batch
dans lequel on redirige la sortie du programme dos vers un fichier
texte. Le programme VB se charge d'attendre la fin d'exécution du
batch. Il ne reste plus qu'à ouvrir le fichier texte depuis VB et
de traiter le résultat.

On trouvera de quoi faire tout cela depuis la FAQ:
http://faq.vb.free.fr/index.php?question2

Voici un programme complet qui fonctionne sur ce principe.

On suppose ici que l'exe à lancer se nomme "toto.exe", et qu'il
génère en sortie une ligne de texte.
Astuce: c'est le programme lui même qui génère le .bat, pour encore
plus de souplesse.



Option Explicit

Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle
As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long)
As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess
As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function SetEnvironmentVariable Lib "kernel32" Alias
"SetEnvironmentVariableA" (ByVal lpName As String, ByVal lpValue As String)
As Long

Private Function ShellWait(ByVal vCommand As String) As Boolean

Dim mProcess As Long
Dim mRet As Long
Dim mPID As Long
Dim bRet As Boolean

On Error GoTo ShellWait_Error

mPID = Shell(vCommand, vbMinimizedNoFocus)
mProcess = OpenProcess(&H1F0FFF, 0, mPID)
Do
mRet = WaitForSingleObject(mProcess, 1000)
If mRet <> &H102& Then
bRet = True
Exit Do
End If
DoEvents
Loop
CloseHandle mProcess

ShellWait_OK:
ShellWait = bRet
On Error GoTo 0
Exit Function

ShellWait_Error:
bRet = False
Resume ShellWait_OK
End Function

Private Sub Command1_Click()
Dim f As Integer
Dim ret As Boolean
Dim s As String

f = FreeFile
Open App.Path & "toto.bat" For Output As #f
Print #f, App.Path & "toto.exe > " & App.Path & "toto.result.txt"
Close #f

ret = ShellWait(App.Path & "toto.bat")
If ret Then
f = FreeFile
Open App.Path & "toto.result.txt" For Input As #f
Line Input #f, s
Close #f
MsgBox "tot a écrit : " & s
Else
MsgBox "erreur lors de l'exécution du batch"
End If
End Sub


Le tout est très simple à adapter.

Mon "toto.exe" pour les tests était un simple programme écrivant
"Coucou Monde" :

#include<stdio.h>
int main(void)
{
printf("Coucou, Monde!n");
return 0;
}

A noter: l'article 152 comporte une erreur mineure : Il faut ajouter à la
fonction
ShellWait une ligne(ShellWait = bRet) juste après l'étiquette
"ShellWait_OK:".

Cordialement


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Sebastien
Salut,

Eh pourquoi ne pas simplement utiliser directement les flux ?
(stdin/stdout/stderr)
C'est quand même a ca que ca sert non ?

++

"Jean-marc" a écrit dans le message de
news:48d64ed8$0$2868$
David wrote:
Bonjour à tous,

Après avoir lancer et utiliser un programme DOS
j'essaye de recevoir le texte affiché dans un programme VB6.
Pensez-vous que cela soit possible et si oui comment ?
Merci d'avance.



Hello,

c'est non seulement possible mais en plus très simple et très
couramment utilisé.
L'idée : lancer le programme Dos depuis VB, via un fichier batch
dans lequel on redirige la sortie du programme dos vers un fichier
texte. Le programme VB se charge d'attendre la fin d'exécution du
batch. Il ne reste plus qu'à ouvrir le fichier texte depuis VB et
de traiter le résultat.

On trouvera de quoi faire tout cela depuis la FAQ:
http://faq.vb.free.fr/index.php?question2

Voici un programme complet qui fonctionne sur ce principe.

On suppose ici que l'exe à lancer se nomme "toto.exe", et qu'il
génère en sortie une ligne de texte.
Astuce: c'est le programme lui même qui génère le .bat, pour encore
plus de souplesse.



Option Explicit

Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle
As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As
Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess
As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function SetEnvironmentVariable Lib "kernel32" Alias
"SetEnvironmentVariableA" (ByVal lpName As String, ByVal lpValue As
String) As Long

Private Function ShellWait(ByVal vCommand As String) As Boolean

Dim mProcess As Long
Dim mRet As Long
Dim mPID As Long
Dim bRet As Boolean

On Error GoTo ShellWait_Error

mPID = Shell(vCommand, vbMinimizedNoFocus)
mProcess = OpenProcess(&H1F0FFF, 0, mPID)
Do
mRet = WaitForSingleObject(mProcess, 1000)
If mRet <> &H102& Then
bRet = True
Exit Do
End If
DoEvents
Loop
CloseHandle mProcess

ShellWait_OK:
ShellWait = bRet
On Error GoTo 0
Exit Function

ShellWait_Error:
bRet = False
Resume ShellWait_OK
End Function

Private Sub Command1_Click()
Dim f As Integer
Dim ret As Boolean
Dim s As String

f = FreeFile
Open App.Path & "toto.bat" For Output As #f
Print #f, App.Path & "toto.exe > " & App.Path & "toto.result.txt"
Close #f

ret = ShellWait(App.Path & "toto.bat")
If ret Then
f = FreeFile
Open App.Path & "toto.result.txt" For Input As #f
Line Input #f, s
Close #f
MsgBox "tot a écrit : " & s
Else
MsgBox "erreur lors de l'exécution du batch"
End If
End Sub


Le tout est très simple à adapter.

Mon "toto.exe" pour les tests était un simple programme écrivant
"Coucou Monde" :

#include<stdio.h>
int main(void)
{
printf("Coucou, Monde!n");
return 0;
}

A noter: l'article 152 comporte une erreur mineure : Il faut ajouter à la
fonction
ShellWait une ligne(ShellWait = bRet) juste après l'étiquette
"ShellWait_OK:".

Cordialement


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;






Avatar
jean-marc
"Sebastien" wrote in message
news:
Salut,

Eh pourquoi ne pas simplement utiliser directement les flux ?
(stdin/stdout/stderr)
C'est quand même a ca que ca sert non ?



Certes, mais ce n'est pas si simple à faire en VB,
à mon avis. Mais c'est aussi probablement une
solution.

Si tu as un exemple qui fonctionne, il sera le bienvenu
pour intégration dans la FAQ.

Cordialement;

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;