lancer un programme DOS et recevoir le texte dans un programme VB
Le
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/
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/
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 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_' ;
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" news:48d64ed8$0$2868$
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_' ;