Delphi XE8 Printe VCL和DocumentProperties奇怪的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Delphi XE8 Printe VCL和DocumentProperties奇怪的问题相关的知识,希望对你有一定的参考价值。

我正在使用vcl.printers单元(delphi XE8),并且在与打印机“交谈”时遇到错误。

我追溯到vcl.printers并找到了这段代码(由EMB人员编写):

if OpenPrinter(ADevice, FPrinterHandle, nil) then
 begin
  if DeviceMode = 0 then  // alloc new device mode block if one was not passed in
begin
  DeviceMode := GlobalAlloc(GHND,
    DocumentProperties(0, FPrinterHandle, ADevice, nil, nil, 0));

  if DeviceMode <> 0 then
  begin
    DevMode := GlobalLock(DeviceMode);
    if DocumentProperties(0, FPrinterHandle, ADevice, DevMode^,
      DevMode^, DM_OUT_BUFFER) < 0 then
    begin
      GlobalUnlock(DeviceMode);
      GlobalFree(DeviceMode);
      DeviceMode := 0;
      DevMode := nil;
    end
  end;
end;
if DeviceMode <> 0 then
  SetPrinterCapabilities(DevMode^.dmFields);
end;

DocumentProperties(0, FPrinterHandle, ADevice, nil, nil, 0)

第一次返回正确的缓冲区大小(我没有在某处写过),然后通过第二个执行时间返回4294967295字节,实际上是-1,因为声明是错误的,但意味着错误。正如您所看到的,VCL代码可以很好地处理错误,因为没有错误检查!但是我有什么错误,为什么?

DocumentProperties位于winspool.dll中

为了从中恢复,我需要重新启动PC,但我不能使用这个多次通过,这对于调试很烦人。打印机只是“PDFcreator”

我尝试使用其他PC,即使我多次运行它也似乎没问题。

我还有两台激光网络打印机。

谢谢

答案

在过去,我确实遇到了两个客户的同样问题。我确实跟踪它到打印机单元(printers.pas)在我国其他地方的远程计算机上很难跟踪它而没有调试器。

好的..但我一直跟踪到这一行:

DeviceMode:= GlobalAlloc(GHND,DocumentProperties(0,FPrinterHandle,ADevice,StubDevMode,StubDevMode,0));在PRINTERS.PAS单元中的函数SetPrinter中

当我把它分成两行时,即首先调用DocumentProperties并将值存储在整数变量中,然后检查该值,然后在值大于0时调用Globalalloc,并在调试文件中使用存储的值调试它如果我没记错的话,错误确实来自SPOOL.DLL的DocumentProperties函数。此函数返回-1作为设备的大小,但仅在一台计算机上使用此客户(他使用4或5与我的程序)

在我的所有客户(接近200个客户)中,我在两台计算机上遇到过这个问题。另一个固定它本身..我不知道它是如何修复的。几分钟前我试图修复的后者。最后我找到了解决方案。我通过简单的快捷方式更改了这个客户。我开始在Windows 10中使用自动修复兼容性,然后运行按钮“测试程序”,它工作..没有错误选择打印机或使用它的属性。好吧..然后我再次尝试使用快捷方式.. aarrgg ..错误返回..但是,然后,啊哈......我心里想“这必须连接到Windows如何运行这个程序”并改变了Windows 10如何运行程序检查“以管理员身份运行”以取消选中。

没问题。

在几乎所有装有Windows 10的计算机上,我都会检查“以管理员身份运行”,没有任何问题。我认为有连接这些点的spool.dll有更新或一些问题。

PS。如果你谷歌这个行为与Delphi DocumentProperties问题,那么你会发现这是已知的问题..有人说连接到x86和x64模式,但我发现了这一点。

以上是关于Delphi XE8 Printe VCL和DocumentProperties奇怪的问题的主要内容,如果未能解决你的问题,请参考以下文章

Delphi XE8帮助中的REST相关内容。

Delphi XE8中Android开发有用的资源!

Delphi - 如何正确注册自 XE8 以来的图形类?

Delphi XE8中Delphi和JAVA数据类型对应关系!

Delphi XE8 编程

DELPHI XE8 远程调试