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奇怪的问题的主要内容,如果未能解决你的问题,请参考以下文章