«Недопустимый вызов процедуры или аргумент», вызывающий regedit в Shell в Word 2013/2016 - PullRequest
0 голосов
/ 28 июня 2019

У меня проблема с некоторыми устаревшими шаблонами кода для 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 \ Компания" "

...