首页 > 解决方案 > 控制台应用程序在直接运行时打印,但在由服务运行时不打印

问题描述

我有一个 C# 控制台应用程序,它通过 API 调用获取 HTML 页面并使用 SHDocVw.InternetExplorer 和 ExecWB 打印文档。当我直接运行应用程序(双击)时,一切都按预期运行。但是,当我从 Windows 服务运行应用程序时,控制台应用程序会挂起,等待打印机响应。

我以管理员身份运行该服务,并且根据我从任务管理器收集的信息,它也以管理员身份运行控制台应用程序。我检查了打印机名称是否有效,并且一切都通过了,因此应用程序似乎可以访问打印机。IE 实例加载文档没有问题,因此有内容要发送到打印机。将 OLECMDEXECOPT_DONTPROMPTUSER 切换为 OLECMDEXECOPT_PROMPTUSER 会在直接运行时给出预期的结果,但在通过服务运行时则没有。

在服务中:

        public void RunProgram(string exePath)
        {
            Process p = new Process();
            p.StartInfo = new ProcessStartInfo(exePath);
            p.Start();
            p.WaitForExit();
        }

在打印功能中:

ie.Navigate(htmlFilename, ref missing, ref missing, ref missing, ref missing);
    while (!documentLoaded && ie.QueryStatusWB(OLECMDID.OLECMDID_PRINT) != OLECMDF.OLECMDF_ENABLED)
        Thread.Sleep(100);

ie.ExecWB(OLECMDID.OLECMDID_PRINT, OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, ref missing, ref missing);
    while (!documentPrinted)
    {
        PrintToErrorFile("waiting for printing to complete...");
        Thread.Sleep(100);
    }

直接运行时,打印函数按预期输出 6 行左右的“waiting...”。从服务运行时,程序按预期运行(API 调用和所有),然后等待消息无限重复。

标签: c#serviceprintingshdocvw

解决方案


我在获得与工作类似的东西时遇到了问题。尽管使用 vb 的 Windows 窗体应用程序这里有几件事要看。在您的代码中,您可以检查 documentLoaded 和 documentPrinted。我假设有一个事件处理程序编码为在 PrintTemplateTeardown 和 DocumentComplete 上触发?我还看到您检查是否启用了打印命令,如果没有,则无限循环。你可能想调查一下。最后,当它导航到您的网页时是否会显示?当您尝试从此页面手动打印时会发生什么,可能会为您提供一些进一步的线索。我的应用程序运行正常,但使用服务帐户运行时浏览器崩溃。我已经确定了一个我不知道如何修复或调试的 rpc 问题。(我需要研究什么来解决这个打印问题


推荐阅读