You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GetInterfaceDnsSettings不兼容*mut DNS_INTERFACE_SETTINGS3及ServerProperties获取问题

从DNS_INTERFACE_SETTINGS3获取ServerProperties成员的问题

问题背景

我尝试从DNS_INTERFACE_SETTINGS3结构体中获取ServerProperties成员,根据官方文档说明,需调用GetInterfaceDnsSettings函数,且当Settings参数的Version成员设为3时,底层结构体应为DNS_INTERFACE_SETTINGS3。

遇到的问题

  1. 编译类型不匹配:调用函数时提示预期原始指针*mut DNS_INTERFACE_SETTINGS,但实际传入的是*mut DNS_INTERFACE_SETTINGS3;手动做类型转换后编译通过,但出现第二个问题。
  2. 字段值异常:在已配置DNS over HTTPS的Windows 11 WiFi适配器上,cServerProperties成员值始终为0,不符合预期。

代码示例

// 注:GUID是通过GetAdaptersAddresses获取并从LUID转换而来,已验证为有效值

let mut dns_interface_settings: DNS_INTERFACE_SETTINGS3 = Default::default();
dns_interface_settings.Version = DNS_INTERFACE_SETTINGS_VERSION3;

// 编译错误:预期`*mut DNS_INTERFACE_SETTINGS`,实际为`*mut DNS_INTERFACE_SETTINGS3`
let dns_setting_result = GetInterfaceDnsSettings(guid, &mut dns_interface_settings as *mut DNS_INTERFACE_SETTINGS3);

// 手动类型转换后编译通过,但cServerProperties值为0
let dns_setting_result = GetInterfaceDnsSettings(guid, &mut dns_interface_settings as *mut _ as *mut DNS_INTERFACE_SETTINGS);

官方文档核心说明(翻译)

GetInterfaceDnsSettings函数的Settings参数要求:

传入的结构体版本必须与Version成员匹配。当Version设为DNS_INTERFACE_SETTINGS_VERSION3时,必须传入DNS_INTERFACE_SETTINGS3类型的结构体指针,该结构体包含DNS服务器属性(如DoH配置)的相关字段。

排查方向

  • 结构体内存布局:确保Rust中DNS_INTERFACE_SETTINGS3的定义添加了#[repr(C)]属性,保证与Windows API的C结构体内存布局、字段顺序、对齐方式完全一致。
  • 权限验证:获取DNS设置可能需要管理员权限,尝试以管理员身份运行程序后重试。
  • GUID准确性:交叉验证传入的适配器GUID是否对应目标WiFi适配器,可通过ipconfig /all命令核对。
  • 函数返回值检查:不要忽略dns_setting_result的返回值,通过Windows错误码排查函数调用是否成功——若调用失败,结构体字段自然不会被正确填充。

内容的提问来源于stack exchange,提问作者50Fifty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 07:02:47