Utilisation de "CreateprocessA" de Kernel32

Résolu
matteli Messages postés 38 Date d'inscription jeudi 23 novembre 2000 Statut Membre Dernière intervention 14 mars 2007 - 16 mars 2006 à 19:49
matteli Messages postés 38 Date d'inscription jeudi 23 novembre 2000 Statut Membre 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

8 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
16 mars 2006 à 20:34
salut,


un simple Shell "cmd.exe", vbHide ne suffit pas?
0
matteli Messages postés 38 Date d'inscription jeudi 23 novembre 2000 Statut Membre Dernière intervention 14 mars 2007
17 mars 2006 à 20:52
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 ?
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
17 mars 2006 à 21:01
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...
0
matteli Messages postés 38 Date d'inscription jeudi 23 novembre 2000 Statut Membre Dernière intervention 14 mars 2007
18 mars 2006 à 10:51
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 ?
0

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

Posez votre question
matteli Messages postés 38 Date d'inscription jeudi 23 novembre 2000 Statut Membre Dernière intervention 14 mars 2007
18 mars 2006 à 10:54
Bon j'arrive pas à éditer monmessage.

Je voulais savoir quels noms courts correspond aux noms longs ?

Merci
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
18 mars 2006 à 11:47
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.



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

Merci encore
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
18 mars 2006 à 11:51
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]
-2
Rejoignez-nous