You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MacOS BigSur下Word VBA调用popen触发运行时错误32815如何解决

问题场景

在Mac OS BigSur系统运行Word 16.63 (22070801)版本时,尝试通过VBA代码调用libc.dylib中的popen函数,原始代码如下:

Private Declare PtrSafe Function popen Lib "libc.dylib" (ByVal command As String, ByVal mode As String) As Long

Sub AutoOpen()
    a = popen("whoami", "r")
End Sub

代码运行后直接触发运行时错误,错误截图如下:
运行时错误截图

错误原因
  • Mac平台16.x及以上版本的Office默认启用VBA沙盒限制,默认权限下VBA没有权限直接加载系统动态库、调用底层系统API,这是微软为防御宏病毒添加的安全机制,是触发该错误的核心原因。
  • 原代码的函数声明存在类型不匹配问题:64位Office环境下popen返回值为FILE*指针类型,占8字节内存,原代码将其声明为4字节长度的Long类型,会触发内存访问错误,即便权限配置正确也无法正常运行。
修复方案

1. 调整Office宏权限配置

  • 打开Word,依次进入顶部菜单栏「Word」→「偏好设置」→「安全性与隐私」
  • 宏权限选择最低限制档位,同时取消勾选沙盒相关的限制选项,配置完成后重启Word生效。注意:该配置会降低Office对恶意宏的防御能力,仅在运行自己确认安全的代码时使用
  • 如果是MacOS 12及以上版本,还需要打开系统设置→隐私与安全性→完全磁盘访问,在列表中勾选Microsoft Word,授予系统资源访问权限。

2. 修正VBA代码声明与逻辑

修正指针类型声明,补全必要的资源释放、输出读取逻辑,可直接运行的代码如下:

' Mac 64位Office下libc接口正确声明
Private Declare PtrSafe Function popen Lib "libc.dylib" (ByVal command As String, ByVal mode As String) As LongPtr
Private Declare PtrSafe Function pclose Lib "libc.dylib" (ByVal stream As LongPtr) As Long
Private Declare PtrSafe Function fgets Lib "libc.dylib" (ByVal buffer As String, ByVal size As Long, ByVal stream As LongPtr) As LongPtr

Sub CallPopenTest()
    Dim pipeHandle As LongPtr
    Dim readBuffer As String * 256
    Dim cmdResult As String
    
    pipeHandle = popen("whoami", "r")
    If pipeHandle = 0 Then
        MsgBox "popen调用失败,请检查宏权限配置"
        Exit Sub
    End If
    
    ' 读取命令执行输出
    cmdResult = ""
    Do While fgets(readBuffer, 256, pipeHandle) <> 0
        cmdResult = cmdResult & Left(readBuffer, InStr(readBuffer, Chr(0)) - 1)
    Loop
    
    ' 必须关闭管道,否则会残留僵尸进程
    pclose pipeHandle
    
    MsgBox "命令执行结果,当前用户:" & cmdResult
End Sub

内容的提问来源于stack exchange,提问作者daisy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 18:24:39