Excel 2016 32-битный макрос, выдававший ошибку макроса в Excel 2016 64-битный - пробовал PtrSafe (оба кода ниже) - PullRequest
0 голосов
/ 27 марта 2020

Попробовав решения для сообщества, он по-прежнему выдает ошибки в 64-битной системе, или я разбиваю его настолько, чтобы он полностью не функционировал.

Это сильно сказывается на работе, и я пытаюсь заставить ее работать быстро, поэтому очень ценю все о вас и вашей помощи в этом.

PS У меня есть только Excel 32 Bit, поэтому мне придется беспокоить другого члена команды для проверки, что еще больше задерживает его.

Фактический код:

Option Explicit
Private Declare PtrSafe Function FindWindow Lib "User32" _
Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLong Lib "User32" _
Alias "GetWindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "User32" _
Alias "SetWindowLongA" (ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Private Declare Function DrawMenuBar Lib "User32" ( _
ByVal hwnd As Long) As Long
Sub RemoveCaption(objForm As Object)
    Dim lStyle          As Long
    Dim hMenu           As Long
    Dim mhWndForm       As Long
    If Val(Application.Version) < 9 Then
        mhWndForm = FindWindow("ThunderXFrame", objForm.Caption) 'XL97
    Else
        mhWndForm = FindWindow("ThunderDFrame", objForm.Caption) 'XL2000+
    End If
    lStyle = GetWindowLong(mhWndForm, -16)
    lStyle = lStyle And Not &HC00000
    SetWindowLong mhWndForm, -16, lStyle
    DrawMenuBar mhWndForm
End Sub

Моя попытка с PtrSafe:

Option Explicit
#If VBA7 Then
Private Declare PtrSafe Function FindWindow Lib "User32" _
Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare PtrSafe Function GetWindowLong Lib "User32" _
Alias "GetWindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long) As Long
Private Declare PtrSafe Function SetWindowLong Lib "User32" _
Alias "SetWindowLongA" (ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Private Declare PtrSafe Function DrawMenuBar Lib "User32" ( _
ByVal hwnd As Long) As Long
#Else
Private Declare PtrSafe Function FindWindow Lib "User32" _
Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLong Lib "User32" _
Alias "GetWindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "User32" _
Alias "SetWindowLongA" (ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Private Declare Function DrawMenuBar Lib "User32" ( _
ByVal hwnd As Long) As Long
#End If
Sub RemoveCaption(objForm As Object)
    Dim lStyle          As Long
    Dim hMenu           As Long
    Dim mhWndForm       As Long
    If Val(Application.Version) < 9 Then
        mhWndForm = FindWindow("ThunderXFrame", objForm.Caption) 'XL97
    Else
        mhWndForm = FindWindow("ThunderDFrame", objForm.Caption) 'XL2000+
    End If
    lStyle = GetWindowLong(mhWndForm, -16)
    lStyle = lStyle And Not &HC00000
    SetWindowLong mhWndForm, -16, lStyle
    DrawMenuBar mhWndForm
End Sub

1 Ответ

0 голосов
/ 27 марта 2020

Я полагаю, что часть вашей проблемы будет исходить от GetWindowLongA. Из документации по этой функции:

Примечание. При извлечении указателя или дескриптора эта функция была заменена функцией GetWindowLongPtr. (Указатели и дескрипторы 32-разрядные в 32-разрядном Windows и 64-разрядные в 64-разрядном Windows.) Чтобы написать код, совместимый как с 32-разрядными, так и с 64-разрядными версиями Windows, используйте GetWindowLongPtr.

Насколько я понимаю, это будет вызывать проблемы. Стоит также отметить, что возвращаемые значения из функции являются переменными в зависимости от ОС. IE 64-битная ОС возвращает QWORD Pointer и 32, но ОС - DWORD.

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