本地打印机驱动程序如何找到网络打印机?

时间:2014-10-29 19:18:24

标签: c# windows sockets printing

(我已经在谷歌搜索了几天。没有运气。商业秘密?)

我有一台自行安装打印机的笔记本电脑(佳能MF4500w系列)。笔记本电脑通过空气与打印机通信。打印机本身直接连接到路由器,打印机不使用静态IP地址。路由器将ip地址分配给打印机。

在我的笔记本电脑中,它们是

中的打印机的无注册表项

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Print \ Monitors \ Standard TCP / IP Port \ Ports

但是,Canon MFNP Port有一个端口条目:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Canon MFNP Port\Ports

of CNMFNP_001E8FB0726C

此注册表项显示:

IPFixed        REG_DWORD    0x000000000 (0)
PrinterPort    REG-DWORD    0x0000238c (9100)
Protocol       REG_DWORD    0x00000001 (1)
TargetAddress  REG_DWORD    0x390b000a (957022218)
TargetMAC      REG_SZ       00-1E-8F-B0-72-6C
TargetPort     REG_DWORD    0x0000021a2 (8610)

我的猜测是打印机驱动程序本身具备通过注册表中的信息搜索联网打印机的功能。

是否有一个Windows函数(理想情况下在C#中)可以执行相同的功能并返回此注册表项中给定内容的打印机的当前IP地址?

非常感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:0)

作为一个新手,我想发布我的发现,希望有更多了解我的人可以改善这个答案。 (我希望这符合SO的精神。)

问题的简短回答是:只有打印机驱动程序知道如何到达目标设备。

答案很长:

  1. 打印必须是Windows操作系统中最弱的非标准化部分之一。
  2. win32_管理系统基于Windows注册表中标准化条目的假设,这对第三方打印机应用程序来说根本不会发生。因此,只有在第三方打印机如何安装自身时才能使用win32_管理系统。
  3. 一旦知道第三方打印机如何安装自己,就可以轻松地找到注册表的特定阅读器以查找第三方打印机使用的信息。但即使有这些信息,它也可能是一个盲目的兔子洞,因为最终它是打印机驱动程序,具有如何处理这些信息的具体知识。
  4. 据我所知,打印机驱动程序之间没有标准化,可能是打印机命令语言的唯一例外,通常称为PCL。
  5. 我确信Windows将PCL嵌入到其中一个API中,但它似乎并不是通过.NET系统提供的。它还需要知道命令所需的特定语法,这也是我(尚未)知道的信息。我对此的简要调查还表明,它需要知道打印机的IP地址,这是另一个兔子洞。
  6. 也许除了打印机的MAC地址外,系统中显然没有常量: 6.1。 “Ip Addresses”窗口显示的只是实际IP地址的别名。我怀疑这里的原因是打印机可以在路由器启动时动态重新分配IP地址。因此,软件可以“跟随”新的IP地址并将该IPAddress分配给别名Ip地址,该地址对于端口描述保持不变。 6.2用户可以任意重命名打印机队列(Windows打印机和设备中显示的打印机队列)。这不是一个常数。 6.3“端口名称”可以由用户任意重命名。 6.4给定的打印机驱动程序可以多次用于不同的设备。这里有一对多的关系。显然,设备驱动程序必须了解安装设备时建立的注册表位置和条目。 (同样,第三方信息。) 6.5即使设备的MAC也可能在路由器级别被欺骗 - 所以即使这是一个常数。
  7. 从最终开始,一切都可以任意设置,只有第三方打印机驱动程序能够理解注册表信息的使用位置和方式,我能想到的最简单的解决方案是: 7.1使用目标设备的MAC标记打印机代码(Windows打印机和设备中的代码)。 7.2不要更改目标设备的MAC。 7.3使用arp -a(或其某些变体)在运行时获取设备的实际IP地址。这将提供IP地址到设备的实际映射。
  8. 我希望专家能够纠正这个答案!感谢。