CreateProcess не получает правильный PID для OSK - PullRequest
0 голосов
/ 06 декабря 2018

В Windows 7, следующий фрагмент Excel VBA 7.1 успешно запускает экранную клавиатуру (OSK.EXE), но значение члена dwProcessID, полученное из параметра proc (информация о процессе) (передано ByRef), не совпадаетэто или любой другой PID, отображаемый диспетчером задач.

Type PROCESS_INFORMATION
     hProcess As Long
     hThread As Long
     dwProcessID As Long ' Integer doesn't work either
     dwThreadID As Long 
End Type

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

Dim proc As PROCESS_INFORMATION
Dim start As STARTUPINFO

start.cb = Len(start)

If CreateProcessA(0, "OSK.EXE", 0, 0, 1, NORMAL_PRIORITY_CLASS, 0, 0, start, 
proc) <> 0 Then
   WaitForInputIdle proc.hProcess, INFINITE
   MsgBox CStr(proc.dwProcessID), vbInformation, "Process ID" ' Wrong for 
OSK, but correct for Notepad and Calc
   CloseHandle (proc.hProcess)
   CloseHandle (proc.hThread)
End If

Для OSK кажется, что значение proc.hProcess неверно.Я проверил значение идентификатора процесса proc.dwProcessID с идентификатором PID, указанным для OSK в диспетчере задач, и они не совпадают.Действительно, proc.dwProcessID не указан ни для одного процесса (даже в Process Explorer), поэтому кажется, что тип PROCESS_INFORMATION не получает правильные выходные данные.

Все отлично работает для NOTEPAD и CALC.Эквивалентный код, скомпилированный в VB.NET, работает правильно с OSK, так что же отличает VBA от неправильной работы CreateProcessA с OSK?

Заранее спасибо, Джон.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Я думаю, что вы сталкиваетесь с такими проблемами, как https://docs.microsoft.com/en-us/office/vba/language/concepts/getting-started/64-bit-visual-basic-for-applications-overview. Long не является хорошей заменой указателей, в этом случае должно быть

Type PROCESS_INFORMATION hProcess As LongPtr hThread As LongPtr dwProcessID As Long dwThreadID As Long End Type</p> <p>Declare Function CreateProcessA Lib "kernel32" (ByVal _ lpApplicationName As LongPtr, ByVal lpCommandLine As String, ByVal _ lpProcessAttributes As LongPtr, ByVal lpThreadAttributes As LongPtr, _ ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _ ByVal lpEnvironment As LongPtr, ByVal lpCurrentDirectory As LongPtr, _ ByRef lpStartupInfo As STARTUPINFO, ByRef lpProcessInformation As _ PROCESS_INFORMATION) As Long

См. Также https://www.jkp -ads.com / статьи / apideclarations.asp

0 голосов
/ 06 декабря 2018

Возможно, запускаемый вами исполняемый файл (OSK.EXE) выполняет другой процесс или выполняет какую-то работу и очень быстро завершает работу, поэтому при просмотре проводника процессов вы ничего не можете найти.Если код внутри «if» не выполняется, я бы попытался получить ошибку с помощью вызова GetLastError.

...