VBA проверить, если конкретный идентификатор задачи процесса все еще работает - PullRequest
3 голосов
/ 20 октября 2010

Я использую функцию Shell() для запуска внешнего приложения в MS Access. Shell() возвращает идентификатор задачи определенного процесса, который был запущен.

Мне нужен способ проверить, работает ли этот процесс или он уже закрыт. Я уверен, что мне нужно будет выполнить какой-то вызов Windows API, но сейчас я ничего не могу найти.

Ответы [ 3 ]

3 голосов
/ 21 октября 2010

Это часто задаваемые вопросы по Access, на которые много лет назад ответили на сайте FAQ по comp.databases.ms-access, http://mvps.org/access/.

API: Shell and Wait

2 голосов
/ 20 октября 2010

Оболочка Tasklist (Описание на http://technet.microsoft.com/en-us/library/bb491010.aspx) - это хороший способ сделать это вручную. Однако я не уверен, как можно автоматизировать взаимодействие со списком PID. Это немного сложнее.

Подсказка: Если вы просто хотите уничтожить процесс, используйте Shell "TaskKill /F /IM ""excel.exe""" для уничтожения всех открытых экземпляров MS Excel или Shell "TaskKill /F /IM ""msaccess.exe""" для уничтожения всех открытых экземпляров MS Access (включая файл Access, в котором находится вашСкрипт VBA, к сожалению). Так я заканчиваю свою стандартную проблему. Ошибка обработчика.

Редактировать

Когда вы его запускаете, вы должны что-то вроде: alt text

0 голосов
/ 27 июля 2012

Я использовал следующее как часть WMI:

Public Function WaitForProcess(ProcessName As String, Optional ProcessID As Boolean = False)

    ' if you dont mind including the reference for Microsoft WMI Scripting V.1.2 Library, uncomment below
    ' Otherwise, it should work fine without the reference, just no intelasense

    UpdateStatus "Starting WaitForProcess function to wait for process: " & ProcessName

    Dim strComputer As String
    Dim colProcesses
    Dim objWMIService

    UpdateStatus "Use this computer to see processes on"
    strComputer = "."

    UpdateStatus "Impersonate this computer"
    Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

    UpdateStatus "Get all running processes with a " & IIf(ProcessID = False, "Name", "ProcessID") & " of: " & ProcessName
    Set colProcesses = objWMIService.ExecQuery("SELECT * " & _
                                               "FROM Win32_Process  " & _
                                               "WHERE " & IIf(ProcessID = False, "Name", "ProcessID") & " = '" & ProcessName & "'")

    UpdateStatus "Waiting untill there are no more instances of this process shown in the process list"
    Do
        DoEvents
        ' Update the collection of processes returned

        Set colProcesses = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE " & IIf(ProcessID = False, "Name", "ProcessID") & " = '" & ProcessName & "'")


    Loop Until colProcesses.Count = 0

    UpdateStatus "The " & IIf(ProcessID = False, "Process Name", "Process ID") & ": " & ProcessName & " concluded successfully. WaitForProcess Completed"

End Function

Это хорошо работает для моего проекта; однако для этого требуется инструментарий управления Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...