gpt4 book ai didi

Delphi TPrinters.GetPrinters 调用挂起

转载 作者:行者123 更新时间:2023-12-03 15:47:14 25 4
gpt4 key购买 nike

我有一个应用程序返回了错误报告。该应用程序是用 Delphi 2006 编写的,在启动过程中挂起。 MadExcept主线程堆栈如下所示。我怀疑没有默认打印机,但我无法在这里复制该故障。

Stack dump from 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com