lancer un programme DOS et recevoir le texte dans un programme VB
3 réponses
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/
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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:".
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:".
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:".
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:".
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" <jm@nowhere.invalid> a écrit dans le message de
news:48d64ed8$0$2868$ba620e4c@news.skynet.be...
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:".
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:".