本文可帮助你解决以下问题:“ 另存为 ”对话框隐藏在打印到 XPS 文档编写器打印机的应用后面,应用程序停止响应。
原始产品版本: XPS 文档编写器
原始 KB 数: 2567869
症状
请考虑以下方案:
- 在 64 位版本的 Windows 7 上运行 32 位应用程序。
- 在应用程序中通过 Microsoft XPS 文档编写器(MXDW)打印机进行打印。 在此方案中,“ 另存为 ”对话框显示在应用程序后面。
此外,可能会遇到以下症状:
- 在输入文件名或取消打印任务之前,应用程序似乎停止响应(挂起)。
- 关闭 “另存为 ”对话框时,打印的应用程序不会成为前台(活动)应用程序。
注释
当打印到驱动程序显示“ 另存为 ”对话框或其他模式对话框的其他打印机时,也可能出现此问题。 Adobe PDF 打印机的打印机驱动程序是这种类型的驱动程序。
原因
打印机驱动程序作为动态链接库(DLL)实现,这些库加载到正在打印的进程中。 打印机驱动程序在 64 位版本的 Windows 上实现为 64 位 DLL,在 32 位版本的 Windows 上实现为 32 位 DLL。
32 位进程无法加载 64 位 DLL。 因此,64 位版本的 Windows 支持通过 Splwow64.exe 进程从 32 位进程打印。 Splwow64.exe 是一个 64 位进程,可以加载 64 位打印机驱动程序,并处理 32 位进程的打印。
当应用程序调用 StartDoc
函数以打印到 XPS 文档编写器打印机时,XPS 文档编写器打印机驱动程序将显示“ 另存为 ”对话框,以便用户可以指定 XPS 文件的名称和位置。 对话框的所有者窗口通常是调用 StartDoc
函数的线程的活动窗口,对话框将显示在活动窗口中。
当 32 位应用程序在 64 位版本的 Windows 上调用 StartDoc
函数时,Splwow64.exe 进程调用 32 位应用程序的 XPS 文档编写器打印机驱动程序。 在此方案中,“ 另存为 ”对话框是未拥有的,因为 Splwow64.exe 进程中的线程没有活动窗口。 对话框可能显示在正在打印的应用程序后面,因为 Splwow64.exe 进程无权设置前台窗口。 此外,由于对话框是未拥有的,因此当对话框关闭时,调用 StartDoc
该函数的应用程序可能不会成为前台应用程序。
StartDoc
在关闭对话框之前,调用不会返回,因此应用程序可能停止响应。
“ 另存为 ”对话框在 Windows 资源管理器任务栏中具有其自己的按钮(如果由 Splwow64.exe 进程创建)。 这是因为对话框没有所有者。 当 Splwow64.exe 进程无法设置前台窗口时,任务栏按钮也会闪烁。
解决方法
若要解决此问题,可以通过其任务栏按钮访问“ 另存为 ”对话框。 或者,可以按 Alt+Tab 将焦点切换到对话框。
详细信息
软件开发人员可以通过让这些应用程序检测到用户何时打印到 XPS 文档编写器打印机或 Adobe PDF 打印机来避免其 32 位应用程序中出现此问题。 然后,应用程序在调用DOCINFO.lpszOutput
函数时指定结构成员中StartDoc
文件的完整路径。 打印机驱动程序将使用指定的文件,而不是提示用户输入文件。
第三方信息免责声明
本文讨论的第三方产品由独立于微软的公司制造。 Microsoft对这些产品的性能或可靠性不作任何明示或暗示的保证。