Application DOS

Seth77 Messages postés 572 Date d'inscription mardi 30 avril 2002 Statut Membre Dernière intervention 4 mai 2020 - 12 févr. 2005 à 23:34
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 - 13 févr. 2005 à 17:52
Slu



Comment detecter avant de lancer une applcation sous "DOS" si cette application tourne deja, mais sans la lancer ??


thx


Herve

9 réponses

cbnet Messages postés 176 Date d'inscription vendredi 29 octobre 2004 Statut Membre Dernière intervention 7 mars 2005
13 févr. 2005 à 00:18
si tu as un prog lancé sous dos, je suppose que tu l'as fait depuis cmd...

si ton prog dos s'appelle mon_prog du coup le titre de ta fenêtre ressemble à un truc comme ça :

C:\WINDOWS\System32\cmd.exe - mon_prog

Ce qu'il te reste à faire, c'est utiliser les API Windows (euh
FindWindow ou FindWindowEx un truc comme ça je sais plus) pour détecter
la liste des fenêtres lancées par rapport à leur titre et donc vérifier
si celle que tu cherches existe...

Pour ça fais une recherche sur ce site, tu trouveras des exemples à adapter

@+
0
Seth77 Messages postés 572 Date d'inscription mardi 30 avril 2002 Statut Membre Dernière intervention 4 mai 2020 1
13 févr. 2005 à 00:25
non pas vraiment j ai recupere du code et je ne comprend pas comment l
application dos est lance. l app dos n est pas apparente et les infos
sont transmise a l app VB par un pipe .

Herve
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
13 févr. 2005 à 15:15
Ton prog la lance avec un shell ou shellexecute en vb6 ?

Cordialement, CanisLupus
0
Seth77 Messages postés 572 Date d'inscription mardi 30 avril 2002 Statut Membre Dernière intervention 4 mai 2020 1
13 févr. 2005 à 15:19
il me semble qu il le lance avec un CreateProcessA mais j en suis pas sure !

Herve
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
13 févr. 2005 à 16:16
Ou un System.Diagnostics.Process ?

Faudrait savir si c vb6 ou vb.net.

Cordialement, CanisLupus
0
Seth77 Messages postés 572 Date d'inscription mardi 30 avril 2002 Statut Membre Dernière intervention 4 mai 2020 1
13 févr. 2005 à 16:29
c VB6

Herve
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
13 févr. 2005 à 16:47
Tu n'as pas accès à la source du prog qui lance l'appli dos ?
Quoi qu'il en soit, si c'est un createprocess, tu devrais la voir dans la liste des tâches (ctrl+alt+suppr).
Si oui, on peut le détecter dans un prog vb si tu connais le nom de l'appli dos.
Un peu plus de précisions STP

Cordialement, CanisLupus
0
Seth77 Messages postés 572 Date d'inscription mardi 30 avril 2002 Statut Membre Dernière intervention 4 mai 2020 1
13 févr. 2005 à 16:59
Le prob c que lorsque l exe est deja lance cela ne marche pas, par
contre il est possible que le programme dos soit lance plusieur fois
mais pas a partir du meme exe !



J ai toujours pense que l exe etait lance avec CreateProcessA mais en
debug je me suis rendu compte que l exe etait lance au demarrage de la
fonction ExecuteCommand et la je ne comprend pas !!





Voila le code que j utilise:



Option Explicit



'API CreatePipe permet de créer un "pipe" anonime,

'on récupére un handle pour lire et un pour ecrire.

Private Declare Function CreatePipe Lib "kernel32" _

(phReadPipe As Long, _

phWritePipe As Long, _

lpPipeAttributes As Any, _

ByVal nSize As Long) As Long



'Utiliser pour lire le "pipe" rempli par le process qui

'sera créé par l'API CretaProcessA

Private Declare Function ReadFile Lib "kernel32" _

(ByVal hFile As Long, _

ByVal lpBuffer As String, _

ByVal nNumberOfBytesToRead As Long, _

lpNumberOfBytesRead As Long, _

ByVal lpOverlapped As Any) As Long



'Structure utilisée par l'API CreateProcessA

Private Type SECURITY_ATTRIBUTES

nLength As Long

lpSecurityDescriptor As Long

bInheritHandle As Long

End Type



'Structure utilisée par l'API CreateProcessA

Private Type STARTUPINFO


cb
As Long

lpReserved As Long

lpDesktop As Long

lpTitle As Long

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



'Structure utilisée par l'API CreateProcessA

Private Type PROCESS_INFORMATION

hProcess As Long

hThread As Long

dwProcessID As Long

dwThreadID As Long

End Type



'Cette API lance un commande et renvoie les infos sur le process

'dans la structure PRECESS_INFORMATION

Private Declare Function CreateProcessA Lib "kernel32" _

(ByVal lpApplicationName As Long, _

ByVal lpCommandLine As String, _


lpProcessAttributes As SECURITY_ATTRIBUTES, _


lpThreadAttributes As SECURITY_ATTRIBUTES, _

ByVal bInheritHandles As Long, _

ByVal dwCreationFlags As Long, _

ByVal lpEnvironment As Long, _

ByVal lpCurrentDirectory As Long, _

lpStartupInfo As STARTUPINFO, _


lpProcessInformation As PROCESS_INFORMATION) As Long



'Cette API Permet de terminer prématurément un process KILLLL :)

Private Declare Function TerminateProcess Lib "kernel32" _

(ByVal hProcess As Long, _

ByVal uExitCode As Long) As Long



'Fermeture d'un handle

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



'Constantes utilisée pour les API

Private Const NORMAL_PRIORITY_CLASS = &H20&

Private Const STARTF_USESTDHANDLES = &H100&

Private Const STARTF_USESHOWWINDOW = &H1



Private mCommand As
String
'Variable privée contenant la ligne de commande

Private mOutputs As
String
'Variable privée pour la lecture du texte renvoié

Private ProcI As PROCESS_INFORMATION 'Process utilisé

Private HLecturePipe As
Long
'Handle de lecture du "pipe"

Private HEcriturePipe As
Long
'Handle d'écriture du "pipe"



'Evénement de reception de donnée de l'objet

Public Event ReceiveOutputs(CommandOutputs As String)



'------------------------------------------------------------

' Propriété publique qui permet de passer ou de lire la ligne

' de commande passer au module

'------------------------------------------------------------

Public Property Let CommandLine(DOSCommand As String)

mCommand = DOSCommand

End Property



Public Property Get CommandLine() As String

CommandLine = mCommand

End Property



'------------------------------------------------------------

' Propriété publique qui permet de lire la totalité des données

' reçues après l'exécution

'------------------------------------------------------------

Public Property Get Outputs()

Outputs = mOutputs

End Property



'------------------------------------------------------------

' Fonction publique qui lance l'éxécution de la ligne de commande

'------------------------------------------------------------

Public Function ExecuteCommand() As String

'Variable contenant le résultat des fonction API

Dim Result As Long

'Variable Structure utilisée par l'API CreateProcessA

Dim Start As STARTUPINFO

'Variable Structure utilisée par l'API CreateProcessA

Dim sa As SECURITY_ATTRIBUTES

'Variable contenant le nombre d'octet lus dans le "pipe"

Dim LngOctetRec As Long

'Variable buffer de lecture du "pipe"

Dim strBuff As String * 256



'Ca c'est pour les couillons qui oublis de donner

'la commande avant de lancer l'exécution....

If Len(mCommand) = 0 Then

MsgBox "La commande à lancer n'a pas été renseignée!!!", vbCritical

Exit Function

End If



'Renseignement de la structure SECURITY_ATTRIBUTES

sa.nLength = Len(sa)

sa.bInheritHandle = 1&

sa.lpSecurityDescriptor = 0&



'Création du "Pipe" et Test du résultat

If CreatePipe(HLecturePipe, HEcriturePipe, sa, 0) = 0 Then

'Si une erreur

MsgBox "Erreur de création du Pipe. Erreurr: " & Err.LastDllError, vbCritical

Exit Function

End If



'Renseignement de la structure STARTUPINFO

Start.cb = Len(Start)

Start.dwFlags = STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW

Start.hStdOutput = HEcriturePipe

Start.hStdError = HEcriturePipe



'Création du process = Exécution de la commande

If CreateProcessA(0&, mCommand, sa, sa, 1&,
NORMAL_PRIORITY_CLASS, 0&, 0&, Start, ProcI) <> 1 Then

'Si une erreur, fermeture des Handles

Result = CloseHandle(HLecturePipe)

Result = CloseHandle(HEcriturePipe)

MsgBox "Fichier ou commande non trouvé", vbCritical

Exit Function

End If



'Fermeture du "pipe" de sortie

Result = CloseHandle(HEcriturePipe)

mOutputs = ""



'Lecture du "pipe" en lecture pour récupérer les infos !

Do

Result = ReadFile(HLecturePipe, strBuff, 256, LngOctetRec, 0&)

'mOutputs = mOutputs & Left(strBuff, LngOctetRec)

'Envoie les données au programme via l'événement

RaiseEvent ReceiveOutputs(Left(strBuff, LngOctetRec))

DoEvents

Loop While Result <> 0



'Fermeture de tous les Handles

Result = CloseHandle(ProcI.hProcess)

Result = CloseHandle(ProcI.hThread)

Result = CloseHandle(HLecturePipe)



'Renvoie du résultat

ExecuteCommand = mOutputs

End Function



Public Sub ClosedCommand()

'Variable contenant le résultat des fonction API

Dim Result As Long



'Force la fermeture du process en cours

TerminateProcess ProcI.hProcess, 0

'Fermeture de tous les Handles

Result = CloseHandle(ProcI.hProcess)

Result = CloseHandle(ProcI.hThread)

Result = CloseHandle(HLecturePipe)

End Sub







Herve
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
13 févr. 2005 à 17:52
Désolé, je cale là-dessus.
Une adresse quand même sur le createpipe :

http://www.mentalis.org/apilist/CreatePipe.shtml

Loup Gris
0
Rejoignez-nous