如何使用Win32 API获取端口名称的网络打印机的IP地址?

时间:2009-10-19 09:25:34

标签: c++ windows winapi printing

如何根据端口名称获取网络打印机的IP地址, 使用win32 API?

我试着调查PRINTER_INFO_* structs,但似乎不存在。

5 个答案:

答案 0 :(得分:3)

您可以通过PRINTER_INFO_2获取端口名称,并从注册表获取IP,路径为: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Print \ Monitors \ Standard TCP / IP Port \ Ports “HostName”中的ip商店

答案 1 :(得分:2)

与任何其他IP网络设备一样,打印机将具有IP地址(表示其以太网卡),并将在某个端口上运行服务(识别响应打印机消息的程序)。这只是网络的东西,与打印机特定的东西没有任何关系。

所以鉴于它只是端口,没有办法找到它的IP地址。可能所有其他打印机上的服务都听同一个端口。

假设您的意思是拥有打印机的名称,则需要查询域名称服务。此服务将网络地址映射为“符号”名称。

使用winsock2 api,我相信你需要gethostbyname。这将按名称检索打印机的主机信息。

答案 2 :(得分:2)

我认为没有一种获取IP地址的标准方法。网络端口监视器可能存在不同的不兼容实现。对于我的网络打印机,IP地址是端口名称的一部分(例如,IP_192_168.1.104)。如果它是那种形式,那么你可以解析它,但我不认为这是普遍的。

使用EnumPorts您可以确定它是否是网络打印机,但我仍然看不到获取IP地址的方法。

答案 3 :(得分:0)

只需使用高级打印机api,动态调用

答案 4 :(得分:0)

我来寻找答案,但我并没有真正接受没有办法,而是发现确实存在。这个答案在Delphi中,但是很简单:

def consumeRows(rowsFut: Future[Option[(Row,Future[_])]]): Unit = {
  rowsFut.foreach {
    _.foreach {
      case (row: Row, nextRowsFut: Future[Option[(Row,Future[_])]]) =>
        // Do something with row
        println(row)
        consumeRows(nextRowsFut)
  }
}
val rowsFut = ask(foo, Bar())(1 seconds).mapTo[Option[(Row,Future[_])]]
consumeRows(rowsFut)