繁体   English   中英

如何使用Win32 API在给定端口名称的情况下获取网络打印机的IP地址?

[英]How can I get the IP address of a network printer given the port name using the Win32 API?

如何使用win32 API获得给定端口名称的网络打印机的IP地址?

我尝试研究PRINTER_INFO_* structs ,但似乎那里不存在。

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

像任何其他IP网络设备一样,打印机将具有IP地址(表示它的以太网卡),并且将在某个端口上运行服务(标识响应打印机消息的程序)。 这仅仅是网络方面的内容,与打印机特定的内容无关。

因此,仅提供端口,就无法找到其IP地址。 可能所有其他打印机上的服务都侦听同一端口。

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

我相信使用winsock2 API,它是您需要的gethostbyname 这将通过其名称检索打印机的主机信息。

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

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

只需使用高级打印机API,即可动态调用

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

function PortIPAddress(Port: string): string;
var
  buf:          PWideChar;
  pd:           PRINTER_DEFAULTS;
  c,
  d,
  bs,
  hXcv:         cardinal;
begin
  Result := 'unknown';

  ZeroMemory(@pd, SizeOf(PRINTER_DEFAULTS));
  pd.DesiredAccess := SERVER_ACCESS_ADMINISTER;

  if OpenPrinter(PAnsiChar(Format(',XcvPort %s', [Port])), hXcv, @pd) then
  begin
    XcvData(hXcv, 'IPAddress', nil, 0, nil, 0, @bs, @c);

    GetMem(buf, bs);
    try
      if XcvData(hXcv, 'IPAddress', nil, 0, buf, bs, @d, @c) then
        Result := buf;
    finally
      FreeMem(buf, bs);
    end;
  end;

  ClosePrinter(hXcv);
end;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM