У меня проблема с некоторыми устаревшими шаблонами кода для Word.В 2007 году он работает нормально, но в 2013/2016 году я получаю сообщение об ошибке «Недопустимый вызов процедуры или аргумент» из вызова Shell.Я обновил код, чтобы использовать LongPtr в соответствии с инструкциями Microsoft, но проблема все еще не решена.Любая помощь будет принята с благодарностью!
Const SYNCHRONIZE = &H100000
Const INFINITE = &HFFFF
Const WAIT_OBJECT_0 = 0
Const WAIT_TIMEOUT = &H102
#If VBA7 Then
Private Declare PtrSafe Function OpenProcess Lib "kernel32" _
(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
ByVal dwProcessId As LongPtr) As LongPtr
Private Declare PtrSafe Function WaitForSingleObject Lib "kernel32" _
(ByVal hHandle As LongPtr, ByVal dwMilliseconds As Long) As LongPtr
Private Declare PtrSafe Function CloseHandle Lib "kernel32" _
(ByVal hObject As LongPtr) As LongPtr
#Else
Private Declare Function OpenProcess Lib "kernel32" _
(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" _
(ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" _
(ByVal hObject As Long) As Long
#End If
Public Sub SynchShell(ShellParam As String)
#If VBA7 Then
Dim lngID As LongPtr
Dim lngHandle As LongPtr
Dim lngRet As LongPtr
#Else
Dim lngID As Long
Dim lngHandle As Long
Dim lngRet As Long
#End If
lngID = Shell(ShellParam, vbMinimizedFocus)
If lngID <> 0 Then
lngHandle = OpenProcess(SYNCHRONIZE, 0, lngID)
If lngHandle <> 0 Then
lngRet = WaitForSingleObject(lngHandle, INFINITE)
CloseHandle (lngHandle)
End If
End If
End Sub
Переданный аргумент для ShellParam (из Watch, так что игнорируйте начальные и конечные кавычки): "regedit / e" C: \ path \ to \ registry.reg ""HKEY_CURRENT_USER \ Software \ Компания" "