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

Arret de programme (VB6)

10 réponses
Avatar
Marc Sylvain
Bonjours,

J'ai un programme (A) qui exécute un deuxième programme



Execution = "X:\Prog\Treeview.exe " & Nom_Dessin

Call ExecCmd(Execution)



Lorsque j'envoi un message d'erreur dans (Treeview.exe ) pour aviser

que je met fin au programme j'aimerai que mon premier programme ce termine
aussi.



Alors comment mettre fin au premier programme (A) ?



Merci

Marc

10 réponses

Avatar
Marc Sylvain
Excuse moi je vien de lire plus bas la reponse
Desole
Marc

"Marc Sylvain" a écrit dans le message de news:

Bonjours,

J'ai un programme (A) qui exécute un deuxième programme



Execution = "X:ProgTreeview.exe " & Nom_Dessin

Call ExecCmd(Execution)



Lorsque j'envoi un message d'erreur dans (Treeview.exe ) pour aviser

que je met fin au programme j'aimerai que mon premier programme ce
termine aussi.



Alors comment mettre fin au premier programme (A) ?



Merci

Marc




Avatar
Marc Sylvain
Je veux plutot metre fin a un SUB (exit sub) de mon
premier programme.

Autrement dit de retourner une reponse a mon premier programme

Marc



"Marc Sylvain" a écrit dans le message de news:

Excuse moi je vien de lire plus bas la reponse
Desole
Marc

"Marc Sylvain" a écrit dans le message de news:

Bonjours,

J'ai un programme (A) qui exécute un deuxième programme



Execution = "X:ProgTreeview.exe " & Nom_Dessin

Call ExecCmd(Execution)



Lorsque j'envoi un message d'erreur dans (Treeview.exe ) pour aviser

que je met fin au programme j'aimerai que mon premier programme ce
termine aussi.



Alors comment mettre fin au premier programme (A) ?



Merci

Marc








Avatar
Jean-marc
Marc Sylvain wrote:
Je veux plutot metre fin a un SUB (exit sub) de mon
premier programme.

Autrement dit de retourner une reponse a mon premier programme



Hello,

Question : Que fais ta procédure ExecCmd ?
Lance t'elle le programme B de façon asynchrone (c'est à
dire que A lance B via ExecCmd et continue son exécution)?

Je suppose que oui, sinon le problème ne se poserait pas.
Mais alors, de quel Sub (Exit sub) parles tu?

Ou alors veux tu un moyen de pouvoir lancer B PUIS
d'attendre la fin de l'exécution pour continuer l'exécution
de A ?

Ou alors le problème est t-il différent et veux tu
une communication entre tes 2 programmes ?

Bref, autant de points à éclaircir avant de pouvoir te
fournir des pistes.

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
Marc Sylvain
Le ExecCmd lance le Programme B a partir de A
Alors A lance B. Et oui je veux une communication entre le 2 programmes

Je n'ai pas de Probleme a lancer un cummunication entre A et B, ma
difficulter
et de retourner une valeur au programme A lorsque mon B c'est terminer par
faute d'une erreur qui c'est produit dans B Voici mon Example

'Programme A
'________________

Private Sub Test ()
Nom_Dessin = "U:999999999999999A01.Asm
Execution = "X:ProgTreeview.exe " & Nom_Dessin
ExecCmd (Execution) 'lancement du programme B avec un donner

'JE VEUX FAIRE UN EXIT SUB ICI SI LE PROGRAMME B
' N'A PAS FAIT COMPLETEMENT CA ROUTINE

IF ....... Then
End if

'Poursuivre le SUB

End sub



'Programme B
'________________
Private Sub Form_Load()
Dim cmdLineOptions As Variant
Dim i As Integer
'Je recupere l'infomation donne par le programme A
cmdLineOptions = GetCommandLine
For i = LBound(cmdLineOptions) To UBound(cmdLineOptions)
Debug.Print cmdLineOptions(i) ' Place un point d'arrêt ici
Next i


If cmdLineOptions(0) <> "" Then
Nom_du_Dessin = cmdLineOptions(0)
Nom_du_Dessin = Mid(Nom_du_Dessin, 2, Len(Nom_du_Dessin) - 2)
End If

Verfier_Erreur = Verifier_Enfant( Nom_du_Dessin)

End Sub

Private Function Verifier_Enfant(Nom_parent As String) As Boolean
If InStr(Nom_parent, "!") > 0 Then
Nom_parent = Left(Nom_parent, InStr(1, Nom_parent, "!", 0) - 1)
End If
If Dir(Nom_parent) = "" Then
MsgBox "imposible de retrouver ce lien " & Nom_parent & " fin du
programme"
'ATTENTION ICI JE FERME LE PROGRAMME ET JE VEUX
'DIRE AU PROGRAMME (A ) DE FAIRE UN EXIT SUB
End
End If

Ce que j'ai fait pour me DÉPANNER.
Lorsque je lancer le programme (B) je vérifie l'existant du fichier



If dir("C :TmpErreur_file.Txt") <> "" then

Kill "C :TmpErreur_file.Txt"

End if



Et S'il provient un erreur je Cree le "C :TmpErreur_file.Txt" alors
lorsque le Programme (B) est

Fermer et quand je retourne dans (A) je vérifie de nouveau l'existence du
fichier "C :TmpErreur_file.Txt"

S'il y a été recréer je fait un EXIT SUB



Marc



"Jean-marc" a écrit dans le message
de news: 45b8fcfb$0$19243$
Marc Sylvain wrote:
Je veux plutot metre fin a un SUB (exit sub) de mon
premier programme.

Autrement dit de retourner une reponse a mon premier programme



Hello,

Question : Que fais ta procédure ExecCmd ?
Lance t'elle le programme B de façon asynchrone (c'est à
dire que A lance B via ExecCmd et continue son exécution)?

Je suppose que oui, sinon le problème ne se poserait pas.
Mais alors, de quel Sub (Exit sub) parles tu?

Ou alors veux tu un moyen de pouvoir lancer B PUIS
d'attendre la fin de l'exécution pour continuer l'exécution
de A ?

Ou alors le problème est t-il différent et veux tu
une communication entre tes 2 programmes ?

Bref, autant de points à éclaircir avant de pouvoir te
fournir des pistes.

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



Avatar
Jean-marc
Marc Sylvain wrote:
Le ExecCmd lance le Programme B a partir de A
Alors A lance B. Et oui je veux une communication entre le 2
programmes
Je n'ai pas de Probleme a lancer un cummunication entre A et B, ma
difficulter
et de retourner une valeur au programme A lorsque mon B c'est
terminer par faute d'une erreur qui c'est produit dans B Voici mon
Example



<snip>

Ce que tu as fait est correct (création d'un fichier etc.)
Pourquoi faire plus compliqué?

En pratique, on ne sait pas (avec VB) quitter et retourner
une valeur. Et le pourrait on qu'on ne saurait pas récupérer
cette valeur.

Si le principe du fichier (pourtant très bon) te déplait,
tu peux faire compliqué en créant une zone de mémoire
partagée entre tes 2 programmes:
A initialise une zone mémoire avec 0 (par exemple) puis
A lance B. Si B rencontre un problème, il écrit par exemple
1 dans cette zone, sinon il laisse à 0.
Au retour dans A, A lit cette zone de mémoire. Si elle est
à 0, tout va bien, sinon, on fait ce qu'on doit faire.

Pour créer une zone de mémoire partagée, voir cet article
que j'ai écrit il y a déjà longtemps:
http://groups.google.fr/group/microsoft.public.fr.vb/browse_frm/thread/33cfbe95541d5919/429a19663aaa40de?lnk=gst&q=m%C3%A9moire+partag%C3%A9e&rnum=1&hl=fr#429a19663aaa40de

Mais franchement, sauf si tu as des contraintes que j'ignore,
c'est carrément overkill !

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
Marc Sylvain
Merci Jean-marc d'avoir pris le temps de me repondre
Pour le fichier, c'est seulement je prefere avoir une reponse
virtuel que physique

Bref je crois quand meme conserver cette facon (Fichier)

Merci encore
Marc

"Jean-marc" a écrit dans le message
de news: 45b916fa$0$1210$
Marc Sylvain wrote:
Le ExecCmd lance le Programme B a partir de A
Alors A lance B. Et oui je veux une communication entre le 2
programmes
Je n'ai pas de Probleme a lancer un cummunication entre A et B, ma
difficulter
et de retourner une valeur au programme A lorsque mon B c'est
terminer par faute d'une erreur qui c'est produit dans B Voici mon
Example



<snip>

Ce que tu as fait est correct (création d'un fichier etc.)
Pourquoi faire plus compliqué?

En pratique, on ne sait pas (avec VB) quitter et retourner
une valeur. Et le pourrait on qu'on ne saurait pas récupérer
cette valeur.

Si le principe du fichier (pourtant très bon) te déplait,
tu peux faire compliqué en créant une zone de mémoire
partagée entre tes 2 programmes:
A initialise une zone mémoire avec 0 (par exemple) puis
A lance B. Si B rencontre un problème, il écrit par exemple
1 dans cette zone, sinon il laisse à 0.
Au retour dans A, A lit cette zone de mémoire. Si elle est
à 0, tout va bien, sinon, on fait ce qu'on doit faire.

Pour créer une zone de mémoire partagée, voir cet article
que j'ai écrit il y a déjà longtemps:
http://groups.google.fr/group/microsoft.public.fr.vb/browse_frm/thread/33cfbe95541d5919/429a19663aaa40de?lnk=gst&q=m%C3%A9moire+partag%C3%A9e&rnum=1&hl=fr#429a19663aaa40de

Mais franchement, sauf si tu as des contraintes que j'ignore,
c'est carrément overkill !

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




Avatar
Joël
bonjour,
peut etre je suis a cote de la plaque ? je ne suis pas sur
d'avoir bien compris le probleme,
mais si j'ai bien compris pourquoi ne pas creer une clé
si erreur: SaveSetting "monprg", "monerreur",true si erreur ou false si fait
et que l'autre prog. controle cette cle pour sortir de procedure sub ?


"Marc Sylvain" a écrit dans le message de news:

Le ExecCmd lance le Programme B a partir de A
Alors A lance B. Et oui je veux une communication entre le 2 programmes

Je n'ai pas de Probleme a lancer un cummunication entre A et B, ma
difficulter
et de retourner une valeur au programme A lorsque mon B c'est terminer par
faute d'une erreur qui c'est produit dans B Voici mon Example

'Programme A
'________________

Private Sub Test ()
Nom_Dessin = "U:999999999999999A01.Asm
Execution = "X:ProgTreeview.exe " & Nom_Dessin
ExecCmd (Execution) 'lancement du programme B avec un donner

'JE VEUX FAIRE UN EXIT SUB ICI SI LE PROGRAMME B
' N'A PAS FAIT COMPLETEMENT CA ROUTINE

IF ....... Then
End if

'Poursuivre le SUB

End sub



'Programme B
'________________
Private Sub Form_Load()
Dim cmdLineOptions As Variant
Dim i As Integer
'Je recupere l'infomation donne par le programme A
cmdLineOptions = GetCommandLine
For i = LBound(cmdLineOptions) To UBound(cmdLineOptions)
Debug.Print cmdLineOptions(i) ' Place un point d'arrêt ici
Next i


If cmdLineOptions(0) <> "" Then
Nom_du_Dessin = cmdLineOptions(0)
Nom_du_Dessin = Mid(Nom_du_Dessin, 2, Len(Nom_du_Dessin) - 2)
End If

Verfier_Erreur = Verifier_Enfant( Nom_du_Dessin)

End Sub

Private Function Verifier_Enfant(Nom_parent As String) As Boolean
If InStr(Nom_parent, "!") > 0 Then
Nom_parent = Left(Nom_parent, InStr(1, Nom_parent, "!", 0) - 1)
End If
If Dir(Nom_parent) = "" Then
MsgBox "imposible de retrouver ce lien " & Nom_parent & " fin du
programme"
'ATTENTION ICI JE FERME LE PROGRAMME ET JE VEUX
'DIRE AU PROGRAMME (A ) DE FAIRE UN EXIT SUB
End
End If

Ce que j'ai fait pour me DÉPANNER.
Lorsque je lancer le programme (B) je vérifie l'existant du fichier



If dir("C :TmpErreur_file.Txt") <> "" then

Kill "C :TmpErreur_file.Txt"

End if



Et S'il provient un erreur je Cree le "C :TmpErreur_file.Txt" alors
lorsque le Programme (B) est

Fermer et quand je retourne dans (A) je vérifie de nouveau l'existence du
fichier "C :TmpErreur_file.Txt"

S'il y a été recréer je fait un EXIT SUB



Marc



"Jean-marc" a écrit dans le
message de news: 45b8fcfb$0$19243$
Marc Sylvain wrote:
Je veux plutot metre fin a un SUB (exit sub) de mon
premier programme.

Autrement dit de retourner une reponse a mon premier programme



Hello,

Question : Que fais ta procédure ExecCmd ?
Lance t'elle le programme B de façon asynchrone (c'est à
dire que A lance B via ExecCmd et continue son exécution)?

Je suppose que oui, sinon le problème ne se poserait pas.
Mais alors, de quel Sub (Exit sub) parles tu?

Ou alors veux tu un moyen de pouvoir lancer B PUIS
d'attendre la fin de l'exécution pour continuer l'exécution
de A ?

Ou alors le problème est t-il différent et veux tu
une communication entre tes 2 programmes ?

Bref, autant de points à éclaircir avant de pouvoir te
fournir des pistes.

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







Avatar
Picalausa François
"Jean-marc" a écrit dans le message
de news: 45b916fa$0$1210$
Marc Sylvain wrote:
Le ExecCmd lance le Programme B a partir de A
Alors A lance B. Et oui je veux une communication entre le 2
programmes




Pour créer une zone de mémoire partagée, voir cet article
que j'ai écrit il y a déjà longtemps:
http://groups.google.fr/group/microsoft.public.fr.vb/browse_frm/thread/33cfbe95541d5919/429a19663aaa40de

Mais franchement, sauf si tu as des contraintes que j'ignore,
c'est carrément overkill !



Hello,

Pour de la communication interprocess, l'exécutable appelant peu, AMHA, être
un simple ActiveX Exe, affichant une interface appropriée pour le traitement
voulu.
C'est très simple, et ça permet la communication bidirectionelle.

Exemple: dans l'ActiveX Exe:
1 classe clsDialogResult; Instancing = 4 - GlobalSingleUse :

Option Explicit

Public Function GetMyDialogAnswer() As Boolean
Dim frmMyForm1 As Form1
Set frmMyForm1 = New Form1

frmMyForm1.Show vbModal
GetMyDialogAnswer = frmMyForm1.OKed
Unload frmMyForm1
End Function

1 form Form1 possédant deux commandbuttons Command1 et Command2:
Option Explicit

Public OKed As Boolean

Private Sub Command1_Click()
OKed = True
Me.Hide
End Sub

Private Sub Command2_Click()
OKed = False
Me.Hide
End Sub

'-------------------------------------------
Dans l'exe appelant, ajouter une référence à l'exe appelé (ActiveX Exe
précédent)
et le code suivant (n'importe ou):
Debug.Print clsDialogResult.GetMyDialogAnswer()

Ce genre de méthode est assez sobre, pas très bricolée.
Le seul inconvénient que j'y vois est la création de références ActiveX qui
peuvent ou non être appréciées, et que le démarrage doit se faire par un sub
main pour l'activeX exe. Il y a peut êtres d'autres désavantages que je n'ai
pas vu?

--
Picalausa François
Avatar
Renfield
l'API ExitProcess est là pour ça... et te permettra de spécifier un
Code de retour

Jean-marc a écrit :
Marc Sylvain wrote:
> Le ExecCmd lance le Programme B a partir de A
> Alors A lance B. Et oui je veux une communication entre le 2
> programmes
> Je n'ai pas de Probleme a lancer un cummunication entre A et B, ma
> difficulter
> et de retourner une valeur au programme A lorsque mon B c'est
> terminer par faute d'une erreur qui c'est produit dans B Voici mon
> Example

<snip>

Ce que tu as fait est correct (création d'un fichier etc.)
Pourquoi faire plus compliqué?

En pratique, on ne sait pas (avec VB) quitter et retourner
une valeur. Et le pourrait on qu'on ne saurait pas récupérer
cette valeur.

Si le principe du fichier (pourtant très bon) te déplait,
tu peux faire compliqué en créant une zone de mémoire
partagée entre tes 2 programmes:
A initialise une zone mémoire avec 0 (par exemple) puis
A lance B. Si B rencontre un problème, il écrit par exemple
1 dans cette zone, sinon il laisse à 0.
Au retour dans A, A lit cette zone de mémoire. Si elle est
à 0, tout va bien, sinon, on fait ce qu'on doit faire.

Pour créer une zone de mémoire partagée, voir cet article
que j'ai écrit il y a déjà longtemps:
http://groups.google.fr/group/microsoft.public.fr.vb/browse_frm/thread/33 cfbe95541d5919/429a19663aaa40de?lnk=gst&q=m%C3%A9moire+partag%C3%A9e&rn um=1&hl=fr#429a19663aaa40de

Mais franchement, sauf si tu as des contraintes que j'ignore,
c'est carrément overkill !

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


Avatar
François Picalausa
On Jan 30, 9:36 am, "Renfield" wrote:
l'API ExitProcess est là pour ça... et te permettra de spécifier un
Code de retour



Hello,

Attention! Ce n'est pas une API à utiliser à la légère!
VBRUN, a contrôle sur ce que fait l'exécution et le fait de s'occuper
de la fermeture à sa place peut poser de sérieux problèmes:
http://support.microsoft.com/kb/q288216/

Mieux vaut donc s'abstenir!
Comme indiqué dans l'article:
<quote src="http://support.microsoft.com/kb/q288216/>
But because of the unpredictable nature of calling ExitProcess() from
Visual Basic, it is better to communicate the success or failure of
the process through some other means, such as writing an exit code to
a file or sending a windows message to another process.
</quoe>

François