Winapi 打印机CreateDC/CreateIC在Windows 10上失败,错误为“不支持”
我正在尝试调用CreateDC以创建打印机设备上下文:Winapi 打印机CreateDC/CreateIC在Windows 10上失败,错误为“不支持”,winapi,printing,windows-10,Winapi,Printing,Windows 10,我正在尝试调用CreateDC以创建打印机设备上下文: printerDC := CreateDC('WINSPOOL', 'HP DeskJet 930C/932C/935C', nil, nil); 该代码在Windows 7中工作,但在Windows 10中失败-返回null 我真的在使用一台真正的打印机: 通过什么 说明如果要获取打印机设备上下文,必须将WINSPOOL作为驱动程序传递: 如何:检索打印机设备上下文 要渲染到特定打印机,必须将WINSPOOL指定为设备,并将正确的打印机
printerDC := CreateDC('WINSPOOL', 'HP DeskJet 930C/932C/935C', nil, nil);
该代码在Windows 7中工作,但在Windows 10中失败-返回null
我真的在使用一台真正的打印机:
通过什么
说明如果要获取打印机设备上下文,必须将WINSPOOL作为驱动程序传递:
如何:检索打印机设备上下文
要渲染到特定打印机,必须将WINSPOOL指定为设备,并将正确的打印机名称传递给。如果要在创建设备上下文时为设备驱动程序提供特定于设备的初始化数据,还可以在对CreateDC的调用中传递结构
以下示例显示了对的调用,其中选择了WINSPOOL驱动程序,并按名称指定打印机名称。
C++
我之所以提到它,是因为有很多代码可以通过:
空字符串
无效的
设备的名称
司机的名字
winspool
WINSPOOL
出身背景
在VCL.Printers的Delphi VCL框架的深处是对Windows函数的调用。在我的Windows 10桌面上,调用失败将返回NULL而不是有效的信息上下文
CreateIC函数不会记录它可能失败的任何方式。它也没有记录它支持调用GetLastError来获取错误。但如果调用GetLastError,则会得到错误代码50:
最小重现性
我从Vcl.Printers.pas中提取了代码,并将其归结为一个简单的可复制示例:
procedure TForm1.Button1Click(Sender: TObject);
var
driver, device, output: string;
dc: HDC;
le: DWORD;
begin
driver := '';
device := 'Microsoft XPS Document Writer';
output := '';
dc := CreateIC(PChar(driver), PChar(device), PChar(output), nil);
if dc = 0 then
begin
le := GetLastError;
raise Exception.CreateFmt('Could not get information context for printer "%s": %s (%d)', [device, SysErrorMessage(le), le]);
end;
end;
该代码在我的Windows 10桌面上失败,但在Windows 7上有效
在这两种情况下,我都使用相同的打印机:
视窗7
视窗10
我做错了什么
CreateDC也失败了
CreateIC只是CreateDC的一种轻量级形式,您可以使用它来获取有关设备的信息,但不能使用它绘制GDI。这还意味着CreateDC在Windows 10上也会失败:
procedure TForm1.Button1Click(Sender: TObject);
var
driver, device: string;
dc: HDC;
le: DWORD;
begin
driver := '';
device := 'Microsoft XPS Document Writer';
dc := CreateDC(PChar(driver), PChar(device), nil, nil);
if dc = 0 then
begin
le := GetLastError;
raise Exception.CreateFmt('Could not get device context for printer "%s": %s (%d)', [device, SysErrorMessage(le), le]);
end;
end;
将设备名称输入到驱动程序名称中:
CreateDC('WINSPOOL', 'Microsoft XPS Document Writer', nil, nil);
我在驱动程序名中输入了WINSPOOL:
CreateDC('WINSPOOL', 'Microsoft XPS Document Writer', nil, nil);
都是打印机
我开始问这个问题的时候认为这只是一个创意
然后我发现CreateDC也失败了,所以我更新了标题
然后我想这是因为我碰巧使用了MicrosoftXPS Document Writer,所以我更新了标题
然后我发现所有的打印机都在Windows10上,所以我再次更新了标题
这是人们提出的自然进化,我发现了更多关于问题本质的东西
| Driver | Device | Result |
|------------------------------------|---------------------------------|--------|
| '' (empty string) | 'Microsoft XPS Document Writer' | Fails |
| 'Microsoft XPS Document Writer' | 'Microsoft XPS Document Writer' | Fails |
| 'WINSPOOL' | 'Microsoft XPS Document Writer' | Fails |
| nil | 'Microsoft XPS Document Writer' | Fails |
| 'Microsoft XPS Document Writer v4' | 'Microsoft XPS Document Writer' | Fails |
| '' (empty string) | 'HP DeskJet 930C/932C/935C' | Fails |
| 'HP DeskJet 930C/932C/935C' | 'HP DeskJet 930C/932C/935C' | Fails |
| 'WINSPOOL' | 'HP DeskJet 930C/932C/935C' | Fails |
| nil | 'HP DeskJet 930C/932C/935C' | Fails |
据我所知,在Windows10中调用CreateDC来创建显示设备上下文也是不正确的。和你一样,我没有测试过
额外阅读
我不是;Embarcadero不支持的错误可能不准确,因为您声明的文档仅报告函数在失败时返回NULL。但是,XPS文档编写器可能不支持在Win10上返回信息上下文。。您是否尝试将HP打印机设置为默认打印机,或将其设置为带有PrinterIndex的活动打印机,以查看是否也出现故障?FWIW这看起来像是一个纯winapiquestion@DavidHeffernan我考虑过这个问题,但a我不想用VCL框架代码来吓跑人们,也就是说,不是我的代码,b我想先发制人,我也不知道如何回答这些问题——因为我不是做这件事的那个人!不过我怀疑,如果您使用的是打印机的名称,winapi专家可能会避开Delphi问题?用于获取打印机名称和驱动程序名称
CreateDC('WINSPOOL', 'Microsoft XPS Document Writer', nil, nil);
| Driver | Device | Result |
|------------------------------------|---------------------------------|--------|
| '' (empty string) | 'Microsoft XPS Document Writer' | Fails |
| 'Microsoft XPS Document Writer' | 'Microsoft XPS Document Writer' | Fails |
| 'WINSPOOL' | 'Microsoft XPS Document Writer' | Fails |
| nil | 'Microsoft XPS Document Writer' | Fails |
| 'Microsoft XPS Document Writer v4' | 'Microsoft XPS Document Writer' | Fails |
| '' (empty string) | 'HP DeskJet 930C/932C/935C' | Fails |
| 'HP DeskJet 930C/932C/935C' | 'HP DeskJet 930C/932C/935C' | Fails |
| 'WINSPOOL' | 'HP DeskJet 930C/932C/935C' | Fails |
| nil | 'HP DeskJet 930C/932C/935C' | Fails |