- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个应用程序返回了错误报告。该应用程序是用 Delphi 2006 编写的,在启动过程中挂起。 MadExcept主线程堆栈如下所示。我怀疑没有默认打印机,但我无法在这里复制该故障。
有人见过这个问题吗?
单元WWPrintToPrinterOrPDFRoutines的初始化部分
initialization
PagesRangeStartPage := 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 ;
end
else
begin
InitialPrintOrientation := GetDefaultPrinterOrientation ;
InitialPrintPaperName := GetDefaultPrinterPaperName ;
end ;
CurrentPreviewPage := 1 ;
NDRMemoryStream := TMemoryStream.Create ;
或拆解:
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
最佳答案
我认为您的程序没有任何问题,或者您可以更改任何内容以使其不会挂起。该系统的操作系统级别出现问题。
NdrClientCall2 函数是远程过程调用网络数据表示引擎的一部分,用于进行 RPC 和 DCOM 调用。
NtConnectPort 是一个连接端口对象的函数(这是一个基本的内核对象,例如互斥体或文件句柄)。端口由 Windows 在 LPC 的最低级别使用。
对 NtConnectPort 的调用将阻塞,直到服务器调用 NtCompleteConnectPort(对 NtConnectPort 的调用没有超时处理)。
所以你的问题是winspool.drv尝试与同一台机器上的另一个进程建立LPC连接(我的猜测是spoolsv.exe,打印机后台处理程序服务,但从提供的信息中无法判断)并且这个其他进程已创建端口 (NtCreatePort),但未对其调用 NtListenPort,或者当 NtListenPort 返回时未对其调用 NtAcceptConnectPort 和 NtCompleteConnectPort。这可以防止进程中每次返回对 NtConnectPort 的调用。
所以真正的问题是在你的进程之外,无论端口的另一端属于哪个进程。
关于Delphi TPrinters.GetPrinters 调用挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5697429/
我有一个应用程序返回了错误报告。该应用程序是用 Delphi 2006 编写的,在启动过程中挂起。 MadExcept主线程堆栈如下所示。我怀疑没有默认打印机,但我无法在这里复制该故障。 有人见过这个
谁能解释一下它是如何工作的(Delphi XE2 在 Windows10 上运行)? 在一个简约的应用程序中 - 带有两个按钮的表单 - 具有以下代码: procedure TForm2.Button
我是一名优秀的程序员,十分优秀!