Код в этом проекте должен быть обновлен для использования на 64-битных системах - PullRequest
1 голос
/ 16 июня 2019

Мы долгое время использовали базу данных MS Access (Office 2007, 32-разрядная версия) в Windows 7, но недавно мы перешли на 64-разрядную версию Office 2016.

Теперь каждая форма отображает следующее сообщение, и это действительно раздражает:

this message

Более того, окно доступа не свернуто.Я не эксперт в VBA и не знаю, что делать.Я вставляю коды.Пожалуйста, не предлагайте какую-либо статью или документацию, предоставленную Microsoft.Я пытался понять это много и не смог.

Используемый код:

Option Compare Database
Private Declare Function SetWindowPos Lib "user32.dll" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

И:

Private Sub Form_Load()
    Application.RunCommand (acCmdAppRestore)
    SetWindowPos Application.hWndAccessApp, 0, 0, 0, 0, 0, 0
    Application.DoCmd.MoveSize 0, 0
End Sub

Ранее (в 32-битном офисе) Раньше окно доступа было скрыто при загрузке формы, но теперь в 64-битном режиме оно широко открыто.Пожалуйста, помогите мне скрыть окно MS Access в 64-битной версии.

Ответы [ 2 ]

2 голосов
/ 16 июня 2019

Обновление программного обеспечения компаний без всесторонних испытаний является дилетантским!

Но если это сообщение об ошибке - единственная проблема, вам повезло.Вам необходимо преобразовать объявление аргументов API в x64, что обычно означает изменение всех Long объявлений дескрипторов и указателей на LongPtr и добавление PtrSafe после Declare.

с помощью условного компилятора (#If VBA7 Then) Office2010 и более поздние версии используют первую часть, так как они поддерживают VBA7 (LongPtr), Office 2007 и более ранние версии, а остальные используют со старым объявлением.

#If VBA7 Then
    Private Declare PtrSafe Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As LongPtr, ByVal hWndInsertAfter As LongPtr, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
#Else
    Private Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
#End If

Это можно найти на Объявление функций API в64-разрядная версия Office .Похоже, вы не используете элементы управления x86 ActiveX или соединения ODBC, потому что они тоже вызывают проблемы.

Вы должны прочитать руководство пользователя Compatibility Inspector , чтобы подготовиться к новым проблемам;)

1 голос
/ 17 июня 2019

Я согласен с ComputerVersteher для первой части, поэтому я отвечу на вторую часть вашего вопроса. Вы можете сделать форму невидимой, сделав это:

Private Sub Form_Load()
    'this turns the forms timer event on every 1 milisecond
    Me.TimerInterval = 1
End Sub

Private Sub Form_Timer()
    Me.Visible = False
    'this turns the timer event off so you don't waste CPU power
    Me.TimerInterval = 0
End Sub
...