首页 > 解决方案 > 从 Windows 计划任务创建 Word OLE 客户端会导致 ntdll 应用程序错误

问题描述

我们的正常工作流程是使用 Windows 计划任务来:

  1. 将文件从 rtf 批量转换为 pdf
  2. 操作 pdf 以添加条形码
  3. 聚合成一个 pdf
  4. 然后发送打印

这在 Windows Server 2008 上运行良好,但自从我们升级到 Windows Server 2019(生命周期结束等)后,我们遇到了一大堆问题。我们现在遇到了第一个障碍——甚至是实例化 Word OLE 客户端。错误不一致 - 一天该过程将成功完成,下一天它将立即失败。

我们的任务触发了一个 Dyalog APL 工作区,要执行的代码就在其中。出于调试目的,我设置了一个简化版本,它执行以下操作:

 tries←0                                                              ⍝ Initialise the try counter
 Log'Attempting to create Word instance'                              ⍝
 :Repeat                                                              ⍝ Keep trying to...
     Word←⎕NEW'OleClient'(⊂'ClassName' 'Word.Application')           ⍝     Create the Word Client instance
     Word.Visible←1                                                   ⍝     making the application visible
     tries+←1                                                         ⍝     and incrementing the try counter each time
     Log'Try: ',⍕tries                                               ⍝
 :Until #.Word.PropList∊⍨⊂'Documents'                                ⍝ Until it has seemingly created successfully
 :OrIf tries≥maxTries_create                                          ⍝ ... or the tries have exceeded the maximum (currently 5)
                                                                      ⍝
 'doc open'delayAndLog dl_open                                        ⍝ With an optional external delay...
 myWordDoc←Word.Documents.Open⊂docPath                                ⍝ open the specified test doc
                                                                      ⍝
 'doc close'delayAndLog dl_close                                      ⍝ With an optional external delay...
 myWordDoc.Close 0                                                    ⍝ close the doc (not saving)
                                                                      ⍝
 'application quit'delayAndLog dl_quit                                ⍝ With an optional external delay...
 Word.Application.Quit 0                                              ⍝ quit the word client

各种延迟保存在外部配置文件中。我没有包括读取这个配置文件,因为基本上这里显示的是实质内容。注意:我重试创建实例,因为有时我发现它只使用准系统方法进行实例化。延迟或重试似乎可以解决此问题。

这段代码将在我的非生产服务器(甚至有时在生产中)中运行得很好。今天,当我通过 IDE 运行它时它会运行良好,但是当作为 Windows 计划任务运行时,它会在打开文档时报告 DOMAIN ERROR。

我的观察是它短暂地创建了WINWORD.exe,即你可以在任务管理器中看到它,状态变为“暂停”,然后它消失了。在事件查看器中,我们看到以下内容:

事件查看器 - ntdll 应用程序故障(ID:1000)

到目前为止我尝试过的事情

  1. 重新启动服务器(是的,你在开玩笑,但我们应该始终尝试的第一件事就是将其关闭再打开)
  2. 修复办公室
  3. 重新安装办公室
  4. 尝试将任务配置为以其他用户身份运行(我自己,具有本地管理员权限)
  5. 尝试将任务配置为在不同的服务器上运行。
  6. 尝试将任务配置为以更高的优先级运行。
  7. 使 Word 实例可见,以查看是否有任何错误弹出窗口。
  8. 构建了任务的简化版本(见上文),以确保它不仅仅是主要任务的整体复杂性导致混乱。
  9. 根据微软的建议禁用“自动墨迹书写”
  10. 捕获错误的 procmon 日志(等待 Microsoft 审核)

当前安装的版本:

任何帮助都会非常感激,因为我觉得我正在处理薛定谔的 OLE 客户端。提前致谢。

标签: ms-officewordoleapldyalog

解决方案


  1. 那是Word中的崩溃。

c:\Users<yourname>\AppData\Local\Temp\ 或 c:\Users<yourname>\AppData\Local\CrashDumps 中可能有故障转储文件。

在您的公司,如果您有任何可以使用 Visual Studio 或 Windbg 的 C 开发人员,他们可以打开转储文件并查看它是否提供任何线索。

如果没有,如果您将其发送给 Dyalog 支持,我可以快速查看一下。

  1. 这只是一个猜测...您是否尝试过增加桌面堆的大小?请参阅此博客文章: https ://docs.microsoft.com/en-us/archive/blogs/ntdebugging/desktop-heap-overview

问候,

文斯


推荐阅读