vba - 需要修复这个错误:'Can't find DLL entry point GetSystemInfo in kernel32'
问题描述
错误:在运行以下代码时遇到“无法在 kernel32 中找到 DLL 入口点 GetSystemInfo”,但仅适用于较新版本的 Kernel32.dll。
Kernel32.dll 6.1.7601.24441 在第一台机器上 - 在第二台机器上不工作 6.1.7601.24236,在第三台机器上工作正常 6.1.7601.24168 - 工作正常
在 32 位和 64 位版本的 Microsoft Access 客户端上测试遇到错误是在 Windows 7 Enterprise 64 位上使用 Kernel32.dll 6.1.7601.24441 和 Microsoft Access 2016 MSO (16.0.4639.1000) 64 位应用了所有 Windows 和 Office 更新
两个 MS-Access 对象:一个 Form 和一个 Module MS-Access Form 需要一个名为 btnDetermineBitVersion 的命令按钮
'-----------------begin of form Code
Option Compare Database
Option Explicit
Private Sub btnDetermineBitVersion_Click()
Dim isSixtyFour As Boolean
Dim strMessage As String
isSixtyFour = IsOffice64Bit()
If isSixtyFour Then
strMessage = "Using 64 bit version of Microsoft Access"
Else
strMessage = "Using 32 bit version of Microsoft Access"
End If
MsgBox strMessage, vbInformation, "Library Health Check"
End Sub
' ----------------------- end of Form code
'------------------------ begin of Module
Option Compare Database
Option Explicit
Public Const PROCESSOR_INTEL_386 As Long = 386
Public Const PROCESSOR_INTEL_486 As Long = 486
Public Const PROCESSOR_INTEL_PENTIUM As Long = 586
Public Const PROCESSOR_MIPS_R4000 As Long = 4000
Public Const PROCESSOR_ALPHA_21064 As Long = 21064
Public Const PROCESSOR_PPC_601 As Long = 601
Public Const PROCESSOR_PPC_603 As Long = 603
Public Const PROCESSOR_PPC_604 As Long = 604
Public Const PROCESSOR_PPC_620 As Long = 620
Public Const PROCESSOR_HITACHI_SH3 As Long = 10003
Public Const PROCESSOR_HITACHI_SH3E As Long = 10004
Public Const PROCESSOR_HITACHI_SH4 As Long = 10005
Public Const PROCESSOR_MOTOROLA_821 As Long = 821
Public Const PROCESSOR_SHx_SH3 As Long = 103
Public Const PROCESSOR_SHx_SH4 As Long = 104
Public Const PROCESSOR_STRONGARM As Long = 2577
Public Const PROCESSOR_ARM720 As Long = 1824
Public Const PROCESSOR_ARM820 As Long = 2080
Public Const PROCESSOR_ARM920 As Long = 2336
Public Const PROCESSOR_ARM_7TDMI As Long = 70001
Public Const PROCESSOR_ARCHITECTURE_INTEL As Long = 0
Public Const PROCESSOR_ARCHITECTURE_MIPS As Long = 1
Public Const PROCESSOR_ARCHITECTURE_ALPHA As Long = 2
Public Const PROCESSOR_ARCHITECTURE_PPC As Long = 3
Public Const PROCESSOR_ARCHITECTURE_SHX As Long = 4
Public Const PROCESSOR_ARCHITECTURE_ARM As Long = 5
Public Const PROCESSOR_ARCHITECTURE_IA64 As Long = 6
Public Const PROCESSOR_ARCHITECTURE_ALPHA64 As Long = 7
Public Const PROCESSOR_ARCHITECTURE_AMD64 As Long = 9
Public Const PROCESSOR_ARCHITECTURE_UNKNOWN As Long = &HFFFF&
Public Const PROCESSOR_LEVEL_80386 As Long = 3
Public Const PROCESSOR_LEVEL_80486 As Long = 4
Public Const PROCESSOR_LEVEL_PENTIUM As Long = 5
Public Const PROCESSOR_LEVEL_PENTIUMII As Long = 6
Public Const sCPURegKey = "HARDWARE\DESCRIPTION\System\CentralProcessor\0"
Public Const HKEY_LOCAL_MACHINE As Long = &H80000002
#If VBA7 Then
Public Type SYSTEM_INFO
wProcessorArchitecture As Integer
dwOemID As Long
dwPageSize As Long
lpMinimumApplicationAddress As LongPtr
lpMaximumApplicationAddress As LongPtr
dwActiveProcessorMask As LongPtr
dwNumberOfProcessors As Long
dwProcessorType As Long
dwAllocationGranularity As Long
wProcessorLevel As Integer
wProcessorRevision As Integer
End Type
#Else
Public Type SYSTEM_INFO
wProcessorArchitecture As Integer
dwOemID As Long
dwPageSize As Long
lpMinimumApplicationAddress As Long
lpMaximumApplicationAddress As Long
dwActiveProcessorMask As Long
dwNumberOfProcessors As Long
dwProcessorType As Long
dwAllocationGranularity As Long
wProcessorLevel As Integer
wProcessorRevision As Integer
End Type
#End If
#If VBA7 Then
Public Declare PtrSafe Sub GetSystemInfo Lib "kernel32" (lpSystemInfo As SYSTEM_INFO)
#Else
Public Declare Sub GetSystemInfo Lib "kernel32" (lpSystemInfo As SYSTEM_INFO)
#End If
#If VBA7 Then
Declare PtrSafe Function IsWow64Process Lib "kernel32" ( _
ByVal hProcess As LongPtr, _
ByRef Wow64Process As Boolean) As Boolean
Declare PtrSafe Function GetCurrentProcess Lib "kernel32" () As LongPtr
#Else
Declare Function IsWow64Process Lib "kernel32" ( _
ByVal hProcess As Long, _
ByRef Wow64Process As Boolean) As Boolean
Declare Function GetCurrentProcess Lib "kernel32" () As Long
#End If
Function IsOffice64Bit() As Boolean
Dim SI As SYSTEM_INFO
IsOffice64Bit = False
GetSystemInfo SI
If SI.wProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64 Then
IsWow64Process GetCurrentProcess(), IsOffice64Bit
IsOffice64Bit = Not IsOffice64Bit
End If
End Function
'------------------------end of Module
预期的结果是一条简单的消息。在使用 Kernel32.dll 版本 6.1.7601.24441 的机器上运行时的结果是崩溃或“在 kernel32 中找不到 DLL 入口点 GetSystemInfo”。
解决方案
已发现我的客户端名为“PROTECT”的安全程序正在阻止我们的 MS-Access 前端程序文件中的脚本访问 kernel32.dll。感谢大家对此进行拍摄。
推荐阅读
- java - 如何从 Spring JPA 存储库中获取 EntityManager
- javascript - Express js 请求正文不是我想要的
- c# - ASP.NET MVC - 使用带有匿名类型和 Jquery 的 JavaScriptStringEncode()
- python - 将连续重复的字符串转换为已知单词
- python - 使用 turtle 或 tkinter 构建蜘蛛图
- python - 计算字典中键(和子键)数量的最佳方法
- json - 如何从 Jenkins 发送变量以便 Postman 环境可以接收它们?
- c++ - 如何从“this”创建智能指针?
- ruby - Ruby gsub 在 IP 地址上重复
- azure-devops-rest-api - 如何在 Azure DevOps 中查找代理池设置