EnumPrinters功能列举了可用的打印机,打印服务器,域或打印提供商。
BOOL EnumPrinters(
DWORD 【旗】, | //枚举类型的打印机对象 |
LPTSTR 【名称】, | //打印机对象的名称 |
DWORD 【水平】, | //指定打印机信息结构的类型 |
LPBYTE 【pPrinterEnum】, | //指向缓冲区的指针,以接收打印机信息结构 |
DWORD 【cbBuf】, | //数组的大小(以字节为单位) |
LPDWORD 【pcbNeeded】, | //指向带变量的指针。的字节复制(或必需) |
LPDWORD 【pcReturned】 | //指向带变量的指针。的打印机信息。结构复制 |
); |
参数
【旗】
指定函数应枚举的打印对象的类型。该值可以是以下常量的组合:
值 | 含义 |
PRINTER_ENUM_LOCAL | 该函数忽略【名称】参数,并枚举本地安装的打印机。 Windows 95:该函数还将枚举网络打印机,因为它们由本地打印提供商处理。 |
PRINTER_ENUM_NAME | 该函数列举了由【名称】标识的打印机。这可以是服务器,域或打印提供者。如果【名称】为NULL,则该函数枚举可用的打印提供者。 |
PRINTER_ENUM_SHARED | 该函数枚举具有共享属性的打印机。不能孤立使用;使用OR操作与另一个PRINTER_ENUM类型相结合。 |
PRINTER_ENUM_DEFAULT | 仅Windows 95:该函数返回有关默认打印机的信息。 |
PRINTER_ENUM_CONNECTIONS | 仅Windows NT:该函数枚举用户先前连接的打印机列表。 |
PRINTER_ENUM_NETWORK | 仅Windows NT:该函数枚举计算机域中的网络打印机。该值仅在【水平】为1时有效。 |
PRINTER_ENUM_REMOTE | 仅Windows NT:该函数列举了计算机域中的网络打印机和打印服务器。该值仅在【水平】为1时有效。 |
如果【水平】为4,则只能使用PRINTER_ENUM_CONNECTIONS和PRINTER_ENUM_LOCAL常量。
【名称】
如果【水平】为1,则【旗】包含PRINTER_ENUM_NAME,【名称】为非空,【名称】指向一个以null结尾的字符串,指定要枚举的对象的名称。该字符串可以是服务器,域或打印提供者的名称。
如果【水平】为1,则【旗】包含PRINTER_ENUM_NAME,【名称】为NULL,该函数枚举可用的打印提供者。
如果【水平】为1,则【旗】包含PRINTER_ENUM_REMOTE,【名称】为NULL,该函数枚举用户域中的打印机。
如果【等级是2或5】,【名称】指向一个空值终止的字符串,指定要打印打印机的枚举名称。如果此字符串为NULL,该函数将枚举本机上安装的打印机。
如果【水平】为4,则【名称】应为NULL。该函数始终在本地机器上查询。
当【名称】为NULL时,它枚举在本地计算机上安装的打印机。这些打印机包括物理连接到本地机器以及具有网络连接的远程打印机的打印机。
【水平】
指定【pPrinterEnum】指向的数据类型.有效值为1,2,4和5,它们对应于PRINTER_INFO_1,PRINTER_INFO_2,PRINTER_INFO_4和PRINTER_INFO_5数据结构。
Windows 95:该值可以是1,2或5。
Windows NT:该值可以是1,2,4或5。
【pPrinterEnum】
指向接收PRINTER_INFO_1,PRINTER_INFO_2,PRINTER_INFO_4或PRINTER_INFO_5结构数组的缓冲区的指针。每个结构包含描述可用打印对象的数据。如果【水平】为1,则该数组包含PRINTER_INFO_1结构。如果【水平】为2,则该数组包含PRINTER_INFO_2结构。如果【水平】为4,则该数组包含PRINTER_INFO_4结构。如果【水平】为5,则该数组包含PRINTER_INFO_5结构。
Windows 95:缓冲区不能接收PRINTER_INFO_4结构。它可以接收任何其他类型。
【cbBuf】
指定【pPrinterEnum.】指向的数组的大小(以字节为单位)
【pcbNeeded】
指向如果函数成功则接收复制的字节数的值的指针,如果【cbBuf】太小则需要的字节数。
【pcReturned】
指向一个值,该值接收PRINTER_INFO_2,PRINTER_INFO_2,PRINTER_INFO_4或PRINTER_INFO_5结构,该函数在数组中返回到【pPrinterEnum】个点。
返回值
如果函数成功,返回值不为零。
如果函数失败,返回值为零。要获取扩展错误信息,请调用GetLastError.
备注
如果EnumPrinters返回指定了PRINTER_ENUM_CONTAINER的PRINTER_INFO_1结构,则表示打印机对象存在层次结构。应用程序可以通过再次调用EnumPrinters来枚举层次结构,将【名称】设置为PRINTER_INFO_1结构的PNAME成员的值。
EnumPrinters功能不检索安全信息。如果在【pPrinterEnum】指向的数组中返回PRINTER_INFO_2结构,则【pSecurityDescriptor】成员将被设置为NULL。
要获取有关默认打印机的信息,请调用GetProfileString功能,将部件名称字符串设置为“Windows”,将键名称字符串设置为“device”。返回的字符串包含默认打印机的名称,打印机DRV文件的名称以及打印机所连接的端口。
Windows NT:
PRINTER_INFO_4结构提供了一种简单而且非常快速的方式来检索本地计算机上安装的打印机的名称以及用户已建立的远程连接。当使用PRINTER_INFO_4数据结构调用EnumPrinters时,该函数将查询注册表中的指定信息,然后立即返回。当与其他级别的PRINTER_INFO_*数据结构调用时,这与EnumPrinters的行为不同。特别地,当{Level 2(PRINTER_INFO_2)数据结构调用EnumPrinters时,它会在每个远程连接上执行OpenPrinter调用。如果远程连接断开,或者远程服务器不再存在,或远程打印机不再存在,则该函数必须等待RPC超时,从而导致OpenPrinter呼叫失败。这可能需要一段时间。通过PRINTER_INFO_4结构可以让应用程序检索所需信息的最小值;如果需要更详细的信息,则可以进行后续的EnumPrinter二级呼叫。
Windows 95:
要快速枚举本地和网络打印机,请使用PRINTER_INFO_5结构。这导致EnumPrinters查询注册表而不是进行远程调用,并且类似于在前面段落中描述的在Windows NT上使用PRINTER_INFO_4结构。
例子
当【水平】参数设置为1时,下表显示各种【旗】值的EnumPrinters输出。
在表格的【名称】参数列中,您应该使用适当的名称替换【打印提供商】 【域】和【机】.例如,对于【打印提供商】,您可以使用Windows NT网络打印提供程序的名称:“Windows NT远程打印机”或Windows 95本地打印提供程序的名称:“Windows 95本地打印提供程序”。要获取打印提供商名称,请使用【名称】设置为NULL来调用EnumPrinters.
【旗】参数 | 【名称】参数 | 结果 |
PRINTER_ENUM_LOCAL | 【名称】参数被忽略。 | 所有本地打印机。 Windows 95:还列举网络打印机,因为它们是在本地安装的。 |
PRINTER_ENUM_NAME | "【打印提供商】" | 所有域名 |
PRINTER_ENUM_NAME | 仅Windows NT: "【打印提供商】!【域】" | 计算机域中的所有打印机和打印服务器 |
PRINTER_ENUM_NAME | 仅Windows NT: "【打印提供商】!!\\【机】" | 所有打印机在\\\\ Machine共享 |
PRINTER_ENUM_NAME | Windows NT:一个空字符串“” Windows 95:本地机器或本地打印机的名称。 | 所有本地打印机。 Windows 95:还列举网络打印机,因为它们是在本地安装的。 |
PRINTER_ENUM_NAME | NULL | 计算机领域的所有打印提供商 |
仅Windows NT: PRINTER_ENUM_CONNECTIONS | 【名称】参数被忽略。 | 所有连接的远程打印机 |
仅Windows NT: PRINTER_ENUM_NETWORK | 【名称】参数被忽略。 | 计算机域中的所有打印机 |
仅Windows NT: PRINTER_ENUM_REMOTE | 一个空字符串“” | 计算机域中的所有打印机和打印服务器 |
仅Windows NT: PRINTER_ENUM_REMOTE | "【打印提供商】" | 与PRINTER_ENUM_NAME相同 |
仅Windows NT: PRINTER_ENUM_REMOTE | "【打印提供商】!【域】" | 无论【域】如何指定,计算机域中的所有打印机和打印服务器。 |
也可以看看
AddPrinter, DeletePrinter, GetPrinter, GetProfileString, PRINTER_INFO_1, PRINTER_INFO_2, PRINTER_INFO_4, PRINTER_INFO_5, SetPrinter