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

C++ 如何使用Win32 API获取给定端口名的网络打印机的IP地址?,c++,windows,winapi,printing,C++,Windows,Winapi,Printing,在给定端口名的情况下,如何获取网络打印机的IP地址, 使用win32 API 我试图查看打印机信息结构,但它似乎不在那里。与任何其他IP网络设备一样,打印机将有一个IP地址(表示其以太网卡),并将在某个端口上运行服务(识别响应打印机消息的程序)。这仅仅是网络方面的东西,与特定于打印机的东西没有任何关系 因此,由于它只是一个端口,所以无法找到它的IP地址。可能所有其他打印机上的服务都侦听同一端口 假设您的意思是拥有打印机的名称,则需要查询域的名称服务。此服务将网络地址映射到“符号”名称 使用Win

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


我试图查看
打印机信息结构,但它似乎不在那里。

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

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

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


使用Winsock2API,我相信这是您需要的。这将按打印机名称检索打印机的主机信息。

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


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

只需使用高级打印机API,动态调用就可以通过打印机信息2获取端口名,然后从注册表获取IP,路径是: HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP端口\Ports
“HostName”中的ip存储我是来寻找答案的,但没有真正接受“没有办法”,并发现确实有。这个答案是用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;

这可能吗?你怎么能只凭端口号就知道呢?好问题——也许你更清楚地知道端口名是什么意思?@Shoban:不是端口号,而是端口名@元素:端口名是在“打印机和传真”中配置打印机端口时需要给出的名称。您可以使用::EnumPrinter win32获取所有打印机的端口名。在本问题的上下文中,“端口”一词有多种含义。我不认为海报是指打印机服务正在监听的端口。Windows按名称和端口跟踪打印机(例如,端口可能是
LPT1:
)。在较新版本的API中,很少需要端口名。端口名在创建后可以编辑,但不能保证“IP_192_168.1.104”实际上是192.168.1.104。您可以通过WMI获得端口名的IP地址,WQL查询为“从Win32_TCPIPPrinterPort选择名称、主机地址”,正如Adrian所说,无法通过API获得此地址。唯一的方法是读取打印服务器上注册表项:HKEY\U LOCAL\U MACHINE\SYSTEM\ControlSet001\Control\print\Monitors\Standard TCP/IP Port\Ports