我有一个 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 调用和所有),然后等待消息无限重复。