从服务产生的进程挂起并调用Print方法

时间:2018-06-26 10:20:42

标签: .net windows vb.net service

我有一个生成子进程的服务,该子进程又将打印作业写入Windows后台打印程序。

这在大多数地方都可以正常工作,除了在一台服务器(运行Server 2008 SP2,其他2008 SP2服务器运行正常)上,子进程在调用时挂起该子进程:

PrintDialog.PrintDocument 

或者如果我执行此操作,它将在“写入”时冻结。

Dim printWriter = PrintQueue.CreateXpsDocumentWriter(printDlg.PrintQueue)
printWriter.Write(paginator, printDlg.PrintTicket)

或使用

System.Drawing.Printing.PrintDocument.Print

没有作业写入假脱机程序队列。

但是,如果我终止了该进程并从命令提示符下手动重新启动子进程,则它可以正常打印。

将主要服务进程设置为使用相同的用户帐户登录,并且产生的进程也以相同的用户帐户运行,因此问题似乎是由于该进程是如何启动的。

启动子进程时,我尝试了以下方法:

Dim psi As New ProcessStartInfo
psi.FileName = exe
psi.Arguments = "ID=" & Id.ToString
psi.UseShellExecute = False
psi.CreateNoWindow = True
psi.Verb = "runas"
psi.RedirectStandardError = True
psi.RedirectStandardOutput = True
psi.LoadUserProfile = True     
ChildProcess = Process.Start(psi)

还有什么我可以做的事情来使服务启动的过程的行为与从cmd提示符启动的过程相同吗?

1 个答案:

答案 0 :(得分:0)

通常无法从服务进行打印,我希望您的意思是Windows服务。原因是Windows服务没有桌面(GDI),因此没有打印机。

因此,尝试从服务进行打印与从您以具有运行GDI引擎的台式机用户打开的控制台进行打印完全不同。

可以从服务中打印一些变通方法,但是这很麻烦,Microsoft不建议这样做!