![](/img/trans.png)
[英]Obtaining the IP address of a local machine based on computer name using Win32 Network API
[英]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.