begin process at 2012 02 16 09:57:02
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Visual Basic 6

 > 

Windows

 > 

API

 > 

Utilisation de ExecCmd


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Utilisation de ExecCmd

dimanche 16 décembre 2007 à 18:34:51 | Utilisation de ExecCmd

PROGRAMMIX

Bonjour

Dans une application, j'affiche une feuille fille dans laquelle se trouve un bouton permettant de lancer une autre application en utilisant le code suivant :

    Dim retval As Long
   
    If AfficherFormulaire Then
        retval = ExecCmd(App.Path & "\ListeDuPersonnel.exe " & RepertoirePersonnel & "FichierDuPersonnel.txt")
    End If
   
    ListeSalariés.LireLeCarnet (RepertoirePersonnel & "FichierDuPersonnel.txt")


Mais si, je ferme ma feuille fille sans avoir précédamment fermer l'application appelée, ça plante.
Théoriquement, je ne devrais pas procéder ainsi, mais ceci est une projection d'une mauvaise manipulation de la part d'un utilisateur lambda.

Que devrais-je faire pour éviter cela ?


Programmix
dimanche 16 décembre 2007 à 19:49:30 | Re : Utilisation de ExecCmd

jmfmarques

Membre Club
Bonjour,

Euh...

Et si tu nous parlais de la fonction ExecCmd qui n'est ni une fonction de VB ni une fonction de l'Api de Windows (du moins à ma connaissance) ?

Tu as apparemment donné ce nom à une fonction ... (tu aurais pu l'appeler toto...)

Que fait-elle (son code ) ?
dimanche 16 décembre 2007 à 20:35:23 | Re : Utilisation de ExecCmd

PROGRAMMIX

OUPS,

Effectivement, c'est une fonction qui appelle la procédure suivante qui appelle certaines API :

Public Function ExecCmd(cmdline$)
     
    Dim proc As PROCESS_INFORMATION
    Dim start As STARTUPINFO
    Dim ret&
   
    ' Initialisez la structure STARTUPINFO :
    start.cb = Len(start)

    ' Démarrez l'application Shell :
    ret& = CreateProcessA(vbNullString, cmdline$, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, vbNullString, start, proc)

    ' Attendez la fin de l'application Shell :
    ret& = WaitForSingleObject(proc.hProcess, INFINITE)
    Call GetExitCodeProcess(proc.hProcess, ret&)
    Call CloseHandle(proc.hThread)
    Call CloseHandle(proc.hProcess)
    ExecCmd = ret&

End Function


Les variables et déclarations sont les suivantes :

Private Type STARTUPINFO
    cb As Long
    lpReserved As String
    lpDesktop As String
    lpTitle As String
    dwX As Long
    dwY As Long
    dwXSize As Long
    dwYSize As Long
    dwXCountChars As Long
    dwYCountChars As Long
    dwFillAttribute As Long
    dwFlags As Long
    wShowWindow As Integer
    cbReserved2 As Integer
    lpReserved2 As Long
    hStdInput As Long
    hStdOutput As Long
    hStdError As Long
End Type

Private Type PROCESS_INFORMATION
    hProcess As Long
    hThread As Long
    dwProcessID As Long
    dwThreadID As Long
End Type

Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

Private Declare Function CreateProcessA Lib "kernel32" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, _
        ByVal lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, _
        ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
        ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As String, _
        lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long

Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long

Private Const NORMAL_PRIORITY_CLASS = &H20&
Private Const INFINITE = -1&

Programmix
dimanche 16 décembre 2007 à 21:20:24 | Re : Utilisation de ExecCmd

jmfmarques

Membre Club

Juste une question :

Si ce n'est que pour faire celà, pourquoi n'utilises-tu pas directement la fonction ShellExecute de l'Api de Windows, voire la fonction Shell de VB ?

genre :

Private RetVal As Long

Private Sub Command1_Click()
    RetVal = Shell("C:\WINNT\notepad.EXE", 1)    ' Run Calculator.
End Sub

 Et tu ne serais pas "planté" en fermant ta form Fille ...

dimanche 16 décembre 2007 à 21:30:02 | Re : Utilisation de ExecCmd

PROGRAMMIX

C'est qu'avec ShellExecute, la procédure n'attend pas la fermeture de l'exe avant de continuer.

Or dans mon cas, il me faut attendre avant de pouvoir recharger le fichier avec les données modifiées via l'exe en question.

Programmix
lundi 17 décembre 2007 à 07:17:57 | Re : Utilisation de ExecCmd

Renfield

Administrateur CodeS-SourceS
vu que tu as le proc.hProcess, tu es en mesure de forcer la fermeture de l'application distante (via API) lorsque l'utilisateur souhaite fermer la form fille. autre possibilité, empecher la fermeture de la fenetre fille tant que l'appi en question n'est pas fermée (dans QueryUnload) tiens une version plus complète de ExecCmd: http://www.vbfrance.com/codes/SHELLANDWAIT-EXECUTER-APPLICATION-ATTENDRE-FIN-RENVOYER-SON-CODE_34867.aspx
mardi 18 décembre 2007 à 20:03:30 | Re : Utilisation de ExecCmd

PROGRAMMIX

Réponse acceptée !
Merci Renfield pour ton code.

Je n'ai pas testé les possibilités que tu proposes avec le proc.hProcess et le QueryUnload.

Je verrai peut-être cela plus tard, mais pour l'instant, ton code me convient.

Programmix


Cette discussion est classée dans : application, feuille, utilisation, fille, execcmd


Répondre à ce message

Sujets en rapport avec ce message

utilisation de feuille mdi [ par molbento ] Bonjour, je développe enn visual basic. J'ai un problème pour développer une application. J'aimerais que pour utilisé mon application l'utilisateur do Première utilisation d'une application avec une page d'accueil [ par Garba51 ] Bonsoir tout le monde, Je me suis inscrit sur ce forum car j'ai besoin de votre aide. Je suis entrain de développer une application en VB2010. Cett Utilisation du "DataSet" [ par math_gury ] Bonjour à tous,J'utilise actuellement dans mon développement un DataSet et TableAdapter :PiloteTableAdapter.InsertQuery("549784136", "PNo", "Nolly", " Utilisation d'une userform et application excel cachée [ par silarkhar ] Bonjour, je crée un formulaire de déclaration avec divers informations à préciser. Pour cela, j'ai créé des userform avec textbox et boutons. Les donn ouvrir une feuille excel sous vb6 [ par Ackby ] Bonjour, je voudrais afficher une feuille donnée d'uu fichier excel, je fais ceci : Private Sub Command1_Click() Dim fichier As Excel.Application Comment créer un log qd utilisation de la base [ par freeman151248 ] Bonjour, Je voudrais pouvoir creer un fichier log pour savoir qui s'est connecté à une base de donnée. La base est interfacée avec une application V VB6 et Excel [ par pask25 ] Bonjour, Ceci est mon premier message qui concerne une demande d'aide de votre part. En principe je vais fouiller dans les forums, les sites et je fi détruire une feuille à l'éxécution [ par igorprg ] Bonjour le monde,je suis presque à la fin de ma petite application, et j'aimerai que pendant le lancement de l'application qu'il y ait juste l'image q Utilisation des codes [ par iznogoud47 ] Bonjour, Je suppose que la question a du être posée quelques fois mais je ne trouve rien par la recherche ni en fouillant dans le forum. J'aimerai sa Utilisation du CPU par une application définie [ par websmiley ] Bonjour à tous.Voilà plusieurs jours que je bloque là-dessus...Je voudrais vérifier l'utilisation CPU d'un processus défini depuis mon application.Par


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 6,802 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales