Delphi TPrinters.GetPrinters呼叫挂起

Delphi TPrinters.GetPrinters呼叫挂起,第1张

概述我有一个已经返回错误报告的应用程序.该应用程序是用Delphi 2006编写的,并在启动时挂起. MadExcept主线程堆栈如下所示.我怀疑没有默认打印机,但我不能在这里复制故障. 谁见过这个问题? 单元WWPrintToPrinterOrPDFRoutines的初始化部分 initializationPagesRangeStartPage := 1 ;PagesRangeEndPag 我有一个已经返回错误报告的应用程序.该应用程序是用Delphi 2006编写的,并在启动时挂起. MadExcept主线程堆栈如下所示.我怀疑没有默认打印机,但我不能在这里复制故障.

谁见过这个问题?

单元WWPrinttoprinterOrpdfRoutines的初始化部分

initializationPagesRangeStartPage    := 1 ;PagesRangeEndPage      := 999 ;PrintRange             := prAll ;PrintcopIEs            := 1 ;PrintCollate           := false ;InitialPrintPapername  := 'A4' ;                                   if (Printer.Printers.Count = 0) then    //  <--------- this causes the hang    begin    InitialPrintOrIEntation       := Printers.poPortrait ;    endelse    begin    InitialPrintOrIEntation       := GetDefaultPrinterOrIEntation ;           InitialPrintPapername         := GetDefaultPrinterPapername ;             end ;CurrentPrevIEwPage     := 1 ;NDRMemoryStream        := TMemoryStream.Create ;@H_419_16@  

或拆解:

WWPrinttoprinterOrpdfRoutines.pas.682: PagesRangeStartPage    := 1 ;    007C4404 C705EC8B81000100 mov [$00818bec],$00000001    WWPrinttoprinterOrpdfRoutines.pas.683: PagesRangeEndPage      := 999 ;    007C440E C705F08B8100E703 mov [$00818bf0],$000003e7    WWPrinttoprinterOrpdfRoutines.pas.684: PrintRange             := prAll ;    007C4418 C605F48B810001   mov byte ptr [$00818bf4],$01    WWPrinttoprinterOrpdfRoutines.pas.685: PrintcopIEs            := 1 ;    007C441F C705F88B81000100 mov [$00818bf8],$00000001    WWPrinttoprinterOrpdfRoutines.pas.686: PrintCollate           := false ;    007C4429 C605FC8B810000   mov byte ptr [$00818bfc],$00    WWPrinttoprinterOrpdfRoutines.pas.687: InitialPrintPapername  := 'A4' ;    007C4430 B8288C8100       mov eax,$00818c28    007C4435 BAC0447C00       mov edx,$007c44c0    007C443A E82D1AC4FF       call @LStrAsg    WWPrinttoprinterOrpdfRoutines.pas.689: if (Printer.Printers.Count = 0) then    007C443F E8B0BCCDFF       call Printer    007C4444 E89FB7CDFF       call TPrinter.GetPrinters   <----- HANG OCCURS HERE@H_419_16@解决方法 我不认为你的程序或任何你可以改变的东西没有任何问题,使这不挂起.该系统在 *** 作系统级别出现问题.  

NdrClIEntCall2函数是远程过程调用网络数据表示引擎的一部分,用于进行RPC和DCOM调用.

NtConnectPort是一个连接端口对象的函数(这是一个基本的内核对象,例如互斥锁或文件句柄). LPC最低级别的窗口使用端口.

对NtConnectPort的调用将阻塞,直到服务器调用NtCompleteConnectPort(对NtConnectPort的调用没有超时处理).

所以你的问题是winspool.drv试图建立一个LPC连接到同一台机器上的另一个进程(我的猜测是spoolsv.exe,打印机后台处理程序服务,但是从提供的信息中无法判断)这个其他进程有创建了一个端口(NtCreatePort)但是没有在其上调用Nt@R_301_6818@enPort,或者当Nt@R_301_6818@enPort返回时没有调用NtAcceptConnectPort和NtCompleteConnectPort.这会阻止您的流程中每次返回时对NtConnectPort的调用.

所以真正的问题是在你的进程之外,无论在端口的另一端属于什么进程.

总结

以上是内存溢出为你收集整理的Delphi TPrinters.GetPrinters呼叫挂起全部内容,希望文章能够帮你解决Delphi TPrinters.GetPrinters呼叫挂起所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1216234.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存