Ben*_*iss 12 sockets delphi winapi winsock
我GetHostByName
用来从主机/ DNS获取IP地址.我也有卡巴斯基互联网安全2013,并注意到它GetHostByName
被它挑选.似乎我的进程试图在其中创建一个子键hklm\SYSTEM\CONTROLSET001\SERVICES\TCPIP\PARAMETERS
.这实际上意味着,如果用户没有任何管理员权限,我就不能使用此功能.有没有其他方法来解决主机/ DNS?
编辑:这里有一个截图:
编辑2:我实际上使用了getaddrinfo,KIS没有"检测到任何东西".我想使用它,但我仍然希望得到Win2K的支持.
EDIT3:添加了Debug ScreenShot
编辑4:这是我的"测试"代码:
program Project2;
{$APPTYPE CONSOLE}
uses
Winsock;
var
DummyWSA : WSADATA;
begin
if WSAStartup($0202, DummyWSA) = 0 then begin
GetHostByName ('localhost');
end;
readln;
end.
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)
这个版本似乎根本没有给注册表写任何东西......
Rem*_*eau 15
gethostbyname()
是通过DNS查询主机名的正确方法(这getaddrinfo()
是一个更好的选择,特别是如果您需要支持IPv6),它绝对不仅限于管理员.许多应用程序使用gethostbyname()
(和/或getaddrinfo()
)因此卡巴斯基不太可能阻止它.
为什么你认为这gethostbyname()
是创建一个注册表项?究竟是在创造什么?它不应该创造任何东西.这可能表明一些外部代码已经陷入困境gethostbyname()
.