如何使用win32 API通过端口名称获取网络打印机的IP地址?
我尝试查看PRINTER_INFO_*
结构体,但似乎没有包含该信息。
如何使用win32 API通过端口名称获取网络打印机的IP地址?
我尝试查看PRINTER_INFO_*
结构体,但似乎没有包含该信息。
您可以通过PRINTER_INFO_2获取端口名称,然后从注册表中获取IP地址,路径为: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports IP地址存储在“HostName”中。
gethostbyname
。这将通过名称检索打印机的主机信息。我认为没有标准的方法来获取IP地址。可能有不同且不兼容的网络端口监视器实现。对于我的网络打印机来说,IP地址是端口名称的一部分(例如,IP_192_168.1.104
)。如果符合这种形式,则可能可以解析出IP地址,但我不认为这是通用的。
使用EnumPorts
函数可以确定是否为网络打印机,但我仍然看不到获取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;
只需使用高级打印机API,动态调用即可