控制台应用程序在直接运行时会打印,但在服务运行时不会打印

时间:2019-05-20 08:34:35

标签: c# service printing shdocvw

我有一个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行左右的“正在等待...”。从服务运行时,程序会按预期运行(API调用和全部运行),然后等待消息将无限重复。

1 个答案:

答案 0 :(得分:1)

我遇到了一些类似于工作的问题。尽管使用vb的Windows窗体应用程序仍然需要注意以下几点。在您的代码中,您将检查documentLoaded和documentPrinted。我假设有一个事件处理程序编码为在PrintTemplateTeardown和DocumentComplete上触发?我还看到您检查是否启用了print命令,否则将无限循环广告。您可能需要调查一下。最后,在浏览到您的网页时是否显示?当您尝试从该页面手动打印时会发生什么,可能会为您提供更多线索。我的应用程序可以正常运行,但是使用服务帐户运行时会导致资源管理器崩溃。我已经找到了一个我不知道如何解决或调试的rpc问题。 (What do I need to look into to fix this printing issue