代码之家  ›  专栏  ›  技术社区  ›  Abe

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

  •  0
  • Abe  · 技术社区  · 6 年前

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

    我以管理员的身份运行该服务,从我从Task Manager收集的信息来看,它也以管理员的身份运行控制台应用程序。我检查了打印机名称是否有效,并且所有内容都通过了检查,因此应用程序似乎可以访问打印机。IE实例加载文档时不会出现问题,因此有内容要发送到打印机。直接运行时,将OLECMDEXECOPT_dontComputer切换为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调用和所有调用),然后等待消息无限重复。

    0 回复  |  直到 6 年前
        1
  •  1
  •   Cunning_as_a_fox    6 年前

    我在工作中遇到过类似的问题。虽然windows窗体应用程序使用vb,但这里有一些东西要看。在您的代码中,您有一个文档加载和文档打印的检查。我假设有一个编码为在PrintTemplateTeardown和DocumentComplete上触发的事件处理程序?我还看到你对print命令的检查被启用了,如果没有启用,就无限循环。你可能想看看这个。最后,ie在导航到你的网页时会显示吗?当你试图从这个页面手动打印时会发生什么,可能会给你一些进一步的线索。我的应用程序可以像我一样运行,但在使用服务帐户运行时会导致explorer崩溃。我已经确定了一个我不知道如何修复或调试的rpc问题。 ( What do I need to look into to fix this printing issue )