Utilisation de "CreateprocessA" de Kernel32 [Résolu]

Messages postés
38
Date d'inscription
jeudi 23 novembre 2000
Dernière intervention
14 mars 2007
- - Dernière réponse : matteli
Messages postés
38
Date d'inscription
jeudi 23 novembre 2000
Dernière intervention
14 mars 2007
- 18 mars 2006 à 13:18
Bonjour,
J'utilise la fonction createprocessA dont je rappelle la déclaration :

Public Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" _
(ByVal lpApplicationName As Long, 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 Long, _
lpStartupInfo As STARTUPINFO, _
lpProcessInformation As PROCESS_INFORMATION) As Long

Y a t'il la possibilité de faire fonctionner la console DOS sans que la fenêtre s'affiche. si oui sur quels arguments agir ?

Merci
Afficher la suite 

8 réponses

Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
0
Merci
salut,


un simple Shell "cmd.exe", vbHide ne suffit pas?
Messages postés
38
Date d'inscription
jeudi 23 novembre 2000
Dernière intervention
14 mars 2007
0
Merci
Je voulais connaitre le moment où ma console se fermait pour que mon programme puisse continuer. J'ai cherché sur le net et j'ai trouvé cette procédure avec "createprocessA". Est ce que la fonction Shell peut faire ça ?
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
0
Merci
s'il n'y a pas déjà une fenêtre de console ouverte, tu peux alors
convertir le pid retourné par shell en handle, puis regarder (timer ou
subclassing) quand elle est fermée.

sinon pour un waitforsingle... (je suppose), en effet il faut passer par createprocess...
Messages postés
38
Date d'inscription
jeudi 23 novembre 2000
Dernière intervention
14 mars 2007
0
Merci
En effet, je me rends compte que je me suis mal exprimé. Tout compte fait dans mon prog VB6, je fais appel à un programme extérieur et je veux savoir quand mon programme extérieure a fini pour continuer mon prog VB6.

Peux-tu détailler les lignes de codes nécessaires nécessaire pour transformé le pid en handle et puis pour regarder si la fenêtre est fermée ? Merci d'avance.

Autre question sur ls commandes DOS.

Comment à partir d'un nom de répertoire long être sur du nom de répertoire cout correspondant ?

Exemple :
J'ai en nom de répertoires longs :
c:\monrépertoireA
c:\monrépertoireB
c:\monrépertoire1
J'ai en nom de répertoires courts :
c:\monrép~1
c:\monrép~2
c:\monrép~3

Comment sont numéroté ces répertoires (par ordre alphabétique) ?
l'accent est-il présent ?
Messages postés
38
Date d'inscription
jeudi 23 novembre 2000
Dernière intervention
14 mars 2007
0
Merci
Bon j'arrive pas à éditer monmessage.

Je voulais savoir quels noms courts correspond aux noms longs ?

Merci
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
0
Merci
re,

bon, pour le pid, voici la fonction :



Function InstanceToWnd(ByVal target_pid As Long) As Long

Dim test_hwnd As Long, test_pid As Long, test_thread_id As Long

'Find the first window

test_hwnd = FindWindow(ByVal 0&, ByVal 0&)

Do While test_hwnd <> 0

'Check if the window isn't a child

If GetParent(test_hwnd) = 0 Then

'Get the window's thread


test_thread_id = GetWindowThreadProcessId(test_hwnd, test_pid)

If test_pid = target_pid Then

InstanceToWnd = test_hwnd

Exit Do

End If

End If

'retrieve the next window

test_hwnd = GetWindow(test_hwnd, GW_HWNDNEXT)

Loop

End Function



seulement je viens d'essayé, çà ne va pas.



donc différemment :




Option Explicit

'

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _

(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

'

Private Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As Long

'

Dim mWnd As Long

'

'

Private Sub Form_Load()

Shell "cmd.exe", vbNormalFocus

Timer1.Enabled = False

Timer1.Interval = 150



Dim i As Long

For i = 0 To 100000

DoEvents

Next i



Dim sTitle As String

sTitle = Environ ("SYSTEMROOT") & "\System32\cmd.exe"

mWnd = FindWindow(vbNullString, sTitle)



If mWnd = 0 Then

MsgBox "echec" ' faire une pause plus grande, ou il y a d'autres fenêtres
cmd ouvertes

Unload Me

Else

Timer1.Enabled = True

Me.Hide

End If

End Sub

'

'

Private Sub Timer1_Timer()

If Not CBool(IsWindowVisible(mWnd)) Then

Timer1.Enabled = False

MsgBox "fenêtre fermée"

Unload Me

End If

End Sub





<small> Coloration
syntaxique automatique [AFCK]</small>







le problème avec cet exemple fonctionnel, c'est que la fenêtre ne doit pas être hidden.

sinon tu peux aller va voir dans les sources de RenField ou de Jack, il
y a des exemples de code "en pause" après une ouverte de fenêtre.



++
Messages postés
38
Date d'inscription
jeudi 23 novembre 2000
Dernière intervention
14 mars 2007
0
Merci
merci pour toutes ces réponses, j'essayerai ça plus tard.

Merci encore
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
-2
Merci
Option Explicit

'

Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" _

(ByVal lpszLongPath As String, ByVal lpszShortPath As String, _

ByVal lBuffer As Long) As Long

'

Private Function GetShortPath(strFileName As String) As String

Dim lngRes As Long, strPath As String

strPath = String$(165, 0)

lngRes = GetShortPathName(strFileName, strPath, 164)

GetShortPath = Left$(strPath, lngRes)

End Function



Private Sub Form_Load()

MsgBox GetShortPath("c:\Program Files")

Unload Me

End Sub




<small> Coloration
syntaxique automatique [AFCK]</small>




PCPT [AFCK]

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.