2010-01-05 9 views
0

Je lance une Access ADE, en utilisant le programme FE de Tony Toews. Les programmes AutoFE vont, si une version plus récente est disponible, copier la dernière version de l'ADE à partir du serveur, puis le lancer. Mon code ressemble:Vérifiez si le programme shell est ouvert

Dim stAutoFE As String = "V:\Apps\autofe\startmdb.exe /cmd /inifile: " & """"   & "V:\Apps\AutoFE\SSP.ini" & """" 
Shell(stAutoFE, AppWinStyle.Hide, True) 
System.Threading.Thread.Sleep(1000) ' Time delay 


Dim oAccess As Access.Application 
oAccess = GetObject(SSP_Path) ' The ADE file location 

je devais mettre le retard de sommeil, faute de quoi le GetObject ouvrirait la ADE une seconde fois. Mais je ne sais pas combien de temps prendra la copie du serveur, donc j'ai besoin de retirer cette ligne de veille et de vérifier que l'ADE a ouvert. Comment puis-je faire cela? Merci Diarmuid

Répondre

0

Vous devez déposer à l'aide Shell et commencer à utiliser Process.WaitForExit method, vous aurez donc pas besoin d'utiliser un Thread.Sleep;

Vous pouvez voir quelques exemples de code lié ici: Process.ExitCode Property

EDIT: Comme C#:

Process process = Process.Start(
    new ProcessStartInfo(@"V:\Apps\autofe\startmdb.exe", 
     String.Format(@"/cmd /inifile: ""{0}""", @"V:\Apps\AutoFE\SSP.ini"))); 
process.WaitForExit(); 
+0

Merci. Je l'ai essayé ce qui suit: Dim myProcess Comme processus = Nothing myProcess = Process.Start (stAutoFE) Bien que non myProcess.HasExited myProcess.WaitForExit (100) myProcess.Refresh() End While myProcess.Close() Mais Process.Start échoue pour moi - j'obtiens le message d'erreur: "Le système ne peut pas trouver le fichier spécifié" même si c'est le même chemin que j'avais pour le Shell. Que devrais-je faire différemment? Merci – Awesomoprog

+0

Got it en essayant myProcess = Process.Start (stAutoFE, stParms) mais toujours le même problème avec la commande Shell. Il pourrait être le 'startmdb.exe' est fini, mais le Msaccess.exe n'est pas. – Awesomoprog

+0

Utilisez-vous 'WaitForExit'? –

1

C'est ce que je dois à la fin. Je vérifie juste que la main gauche du titre Windows correspond au nom de ce que je cherche. utilisation serait:

*If IsAppOpen("OMain", "SSP") then* 

Omain est le nom de la classe d'accès.

code

comme suit:

Private Declare Auto Function FindWindow Lib "user32" (_ 
     ByVal lpClassName As String, _ 
     ByVal lpWindowName As String) As IntPtr 

    Private Declare Auto Function GetWindowText Lib "user32" (_ 
     ByVal hwnd As IntPtr, _ 
     ByVal lpString As String, _ 
     ByVal cch As Integer) As Integer 

    Public Function IsAppOpen(ByVal stClassName As String, ByVal stAppName As String) As Boolean 
     ' Find out if application is open 
     ' Checks if stAppName matches the left hand characters of the Window name 

     Dim hwnd As IntPtr = FindWindow(stClassName, vbNullString) 

     Dim stWindowText As String 
     Dim bAppFound As Boolean = False 

     If Not hwnd.Equals(IntPtr.Zero) Then 

     stWindowText = New String(Chr(0), 100) 
     Dim intLength As Integer = GetWindowText(hwnd, stWindowText, stWindowText.Length) 

     If (intLength <= 0) OrElse (intLength > stWindowText.Length) Then 
      bAppFound = False 
     Else 
      Dim stTitle As String = stWindowText.Substring(0, intLength) 

      If stTitle.Substring(0, stAppName.Length) = stAppName Then 
       bAppFound = True 
      End If 
     End If 
     End If 

     IsAppOpen = bAppFound 

    End Function