Excel VBA7运行时错误'453':无法找到DLL入口点GetUnits求助
解决Excel VBA7运行时错误'453':无法找到DLL入口点GetUnits的方案
确认DLL中函数的实际导出名称
多数DLL编译时会因C++名字修饰规则改变函数名,比如GetUnits可能变成_GetUnits@0这类带后缀的名称。可以通过以下方式查看导出表:- 使用Visual Studio的
dumpbin命令:在命令行执行dumpbin /exports "C:\Users\svd.dll",查看输出里的函数列表。 - 用Dependency Walker工具打开DLL,直接查看导出的函数名称。
如果发现实际导出名不是GetUnits,修改VBA声明语句,比如实际名称是_GetUnits@0,则声明改为:
Declare PtrSafe Function GetUnits Lib "C:\Users\svd.dll" Alias "_GetUnits@0" () As String- 使用Visual Studio的
匹配函数调用约定
VBA默认使用StdCall调用约定,若DLL中的GetUnits是Cdecl编译的,会导致入口点不匹配。此时需要在声明中添加Cdecl关键字:Declare PtrSafe Function GetUnits Lib "C:\Users\svd.dll" () As String Cdecl验证DLL与Excel的位数一致性
VBA7对应64位Excel,必须使用64位版本的DLL。若svd.dll是32位,64位Excel无法正常加载,也会触发该错误。检查位数的方法:- 执行
dumpbin /headers "C:\Users\svd.dll",查看输出中machine字段:x86代表32位,x64代表64位。 - 确认Excel位数(文件→账户→关于Excel)与DLL位数完全一致。
- 执行
检查DLL路径有效性
即使使用绝对路径,若路径包含空格或特殊字符,可能导致加载失败。可以尝试将DLL移至系统目录(如C:\Windows\System32),或使用短路径格式声明,比如原路径是C:\Users\My User\svd.dll,可改为C:\Users\MYUSE~1\svd.dll。匹配函数返回值类型
VBA的String对应BSTR类型,若DLL中GetUnits返回的是char*而非BSTR,直接声明为As String会引发错误。需调整声明及调用逻辑:
首先修改函数声明:Declare PtrSafe Function GetUnits Lib "C:\Users\svd.dll" () As LongPtr然后添加辅助函数读取字符串:
Private Declare PtrSafe Function lstrlenA Lib "kernel32" (ByVal lpString As LongPtr) As Long Private Declare PtrSafe Function lstrcpyA Lib "kernel32" (ByVal lpString1 As String, ByVal lpString2 As LongPtr) As LongPtr Private Function PeekString(ByVal ptr As LongPtr) As String Dim lenStr As Long lenStr = lstrlenA(ptr) PeekString = String$(lenStr, 0) Call lstrcpyA(PeekString, ptr) End Function最后修改调用代码:
Dim ptr As LongPtr ptr = GetUnits() UnitStr = StrConv(PeekString(ptr), vbUnicode)
内容的提问来源于stack exchange,提问作者papaest
相关产品推荐
相关产品推荐

