【发布时间】:2013-03-06 18:56:57
【问题描述】:
我正在使用GetHostByName 从主机/DNS 获取 IP 地址。我也有 Kaspersky Internet Security 2013 并注意到 GetHostByName 被它选中。看来我的进程试图在hklm\SYSTEM\CONTROLSET001\SERVICES\TCPIP\PARAMETERS 中创建一个子键。这实际上意味着,如果用户没有任何管理员权限,我将无法使用此功能。有没有其他方法可以解析主机/dns?
编辑:这里是截图:
编辑2: 我实际上使用了 getaddrinfo 并且 KIS 没有“检测到任何东西”。我想使用它,但我仍然希望支持 Win2K。
EDIT3:添加了调试屏幕截图
EDIT4:这是我的“测试”代码:
program Project2;
{$APPTYPE CONSOLE}
uses
Winsock;
var
DummyWSA : WSADATA;
begin
if WSAStartup($0202, DummyWSA) = 0 then begin
GetHostByName ('localhost');
end;
readln;
end.
EDIT5:GetAddrInfo 版本...
program Project2;
{$APPTYPE CONSOLE}
uses
Winsock;
type
PAddrInfo = ^TAddrInfo;
TAddrInfo = packed record
ai_flags: Integer;
ai_family: Integer;
ai_socktype: Integer;
ai_protocol: Integer;
ai_addrlen: LongWord;
ai_canonname: Array of Char;
ai_addr: PSOCKADDR;
ai_next: PAddrInfo;
end;
function getaddrinfo(const nodename: PChar; const servname : PChar; const hints: PAddrInfo; var res: PAddrInfo): Integer; stdcall; external 'ws2_32.dll' name 'getaddrinfo';
procedure freeaddrinfo(ai: PAddrInfo); stdcall; external 'ws2_32.dll' name 'freeaddrinfo';
var
DummyWSA : WSADATA;
SocketHint : PAddrInfo;
SocketResult : PAddrInfo;
begin
if WSAStartup($0202, DummyWSA) = 0 then begin
//GetHostByName ('localhost');
getaddrinfo ('localhost', '80', SocketHint, SocketResult);
// getaddrinfo ('localhost', NIL, SocketHint, SocketResult); // Not sure if I can NIL the port...
end;
readln;
end.
这个版本似乎根本没有向注册表写入任何东西...
【问题讨论】:
-
如果有,那可能和卡巴斯基有同样的冲突。您应该能够以非管理员身份调用 GetHostByName。调用堆栈是什么样的?
-
你有没有尝试过使用这个函数并看到它实际上失败你只是假设它会失败你在这个调用堆栈中读到了什么?因为我可以告诉你,
GetHostByName不仅限于管理员帐户。 -
哇,我永远不会安装卡巴斯基。
-
这是我讨厌卡巴斯基的原因之一。我们的软件完全从客户的硬盘驱动器中完全删除(未隔离),因为它不喜欢连接到 FTP 站点。
-
只是一个建议 - 如果您有一个可以添加到应用程序的数字签名,请尝试一下,也许卡巴斯基会尊重您的应用程序的调用。
标签: delphi sockets winapi winsock