【发布时间】:2016-10-13 03:31:24
【问题描述】:
如何获取用户在 Winapi 中的 IP 控制框中插入的 IP,以便在之后验证它?
已经尝试过 GetDlgItem() 但它似乎没有以正确的格式存储 IP,也许我做错了。我将其存储为 DWORD。
有什么建议吗?
【问题讨论】:
如何获取用户在 Winapi 中的 IP 控制框中插入的 IP,以便在之后验证它?
已经尝试过 GetDlgItem() 但它似乎没有以正确的格式存储 IP,也许我做错了。我将其存储为 DWORD。
有什么建议吗?
【问题讨论】:
您通过发送IPM_GETADDRESS 消息从IP Address Control 检索IP 地址1):
DWORD dwAddr = 0x0;
SendMessage(hWndIpAddr, IPM_GETADDRESS, 0, (LPARAM)&dwAddr);
返回时,DWORD 包含 IP 地址,其中 MSB 存储第一个八位字节,而 LSB 存储第四个八位字节。您可以像这样以人类可读的格式输出地址:
printf("%u.%u.%u.%u\n", (dwAddr >> 24) & 0xff,
(dwAddr >> 16) & 0xff,
(dwAddr >> 8) & 0xff,
(dwAddr ) & 0xff);
或者,使用FIRST_IPADDRESS、SECOND_IPADDRESS、THIRD_IPADDRESS 和FOURTH_IPADDRESS 宏来提取地址信息:
printf("%u.%u.%u.%u\n", FIRST_IPADDRESS(dwAddr), SECOND_IPADDRESS(dwAddr),
THIRD_IPADDRESS(dwAddr), FOURTH_IPADDRESS(dwAddr));
DWORD,因此无需验证它,因为任何DWORD(如果解释为 IPv4 地址的 4 个部分) ) 是一个有效的地址。
【讨论】:
DWORD中提取各个组件的宏:FIRST_IPADDRESS()、SECOND_IPADDRESS()等
正如 IInspectable 所指出的,一种方法是发送 IPM_GETADDRESS 消息,但第二种也是最简单的方法是调用 GetWindowText。这将删除不必要的 printf。
WCHAR wAddress[64] = {0};
GetWindowTextW(hWndIpAddr, wAddress, 32);
【讨论】:
printf 来说明如何从DWORD 中提取单个信息。这不是必需的。现在,如果您检索文本表示,您将不得不解析出令牌以将其存储到 sockaddr 中,例如。这确实是常见的用例。