首页 > 其他分享 >一个数据类型困扰了我一下午

一个数据类型困扰了我一下午

时间:2024-10-27 11:45:01浏览次数:11  
标签:困扰 struct ULONG ADAPTER 下午 数据类型 LH ADDRESS PIP

用VBA写一个网络状态查看程序,调用用GetAdaptersAddresses函数。其中返回值的类型如上!没有现在的代码代参考。只能从MSDN上找help自己改写。结果返回的值就是对不上!本人知道是数据类型有问题,核对了好多次,就是找不到出错点!

typedef struct _IP_ADAPTER_ADDRESSES_LH {
  union {
    ULONGLONG Alignment;
    struct {
      ULONG    Length;
      IF_INDEX IfIndex;
    };
  };
  struct _IP_ADAPTER_ADDRESSES_LH    *Next;
  PCHAR                              AdapterName;
  PIP_ADAPTER_UNICAST_ADDRESS_LH     FirstUnicastAddress;
  PIP_ADAPTER_ANYCAST_ADDRESS_XP     FirstAnycastAddress;
  PIP_ADAPTER_MULTICAST_ADDRESS_XP   FirstMulticastAddress;
  PIP_ADAPTER_DNS_SERVER_ADDRESS_XP  FirstDnsServerAddress;
  PWCHAR                             DnsSuffix;
  PWCHAR                             Description;
  PWCHAR                             FriendlyName;
  BYTE                               PhysicalAddress[MAX_ADAPTER_ADDRESS_LENGTH];
  ULONG                              PhysicalAddressLength;
  union {
    ULONG Flags;
    struct {
      ULONG DdnsEnabled : 1;
      ULONG RegisterAdapterSuffix : 1;
      ULONG Dhcpv4Enabled : 1;
      ULONG ReceiveOnly : 1;
      ULONG NoMulticast : 1;
      ULONG Ipv6OtherStatefulConfig : 1;
      ULONG NetbiosOverTcpipEnabled : 1;
      ULONG Ipv4Enabled : 1;
      ULONG Ipv6Enabled : 1;
      ULONG Ipv6ManagedAddressConfigurationSupported : 1;
    };
  };
  ULONG                              Mtu;
  IFTYPE                             IfType;
  IF_OPER_STATUS                     OperStatus;
  IF_INDEX                           Ipv6IfIndex;
  ULONG                              ZoneIndices[16];
  PIP_ADAPTER_PREFIX_XP              FirstPrefix;
  ULONG64                            TransmitLinkSpeed;
  ULONG64                            ReceiveLinkSpeed;
  PIP_ADAPTER_WINS_SERVER_ADDRESS_LH FirstWinsServerAddress;
  PIP_ADAPTER_GATEWAY_ADDRESS_LH     FirstGatewayAddress;
  ULONG                              Ipv4Metric;
  ULONG                              Ipv6Metric;
  IF_LUID                            Luid;
  SOCKET_ADDRESS                     Dhcpv4Server;
  NET_IF_COMPARTMENT_ID              CompartmentId;
  NET_IF_NETWORK_GUID                NetworkGuid;
  NET_IF_CONNECTION_TYPE             ConnectionType;
  TUNNEL_TYPE                        TunnelType;
  SOCKET_ADDRESS                     Dhcpv6Server;
  BYTE                               Dhcpv6ClientDuid[MAX_DHCPV6_DUID_LENGTH];
  ULONG                              Dhcpv6ClientDuidLength;
  ULONG                              Dhcpv6Iaid;
  PIP_ADAPTER_DNS_SUFFIX             FirstDnsSuffix;
} IP_ADAPTER_ADDRESSES_LH, *PIP_ADAPTER_ADDRESSES_LH;

要把以上代码转换成VBA的type格式,要核对许多数据类型,并找到与vba的对应关系!没有VC++的库文件,所以找起来很麻烦!【注:vc++开发环境太庞大,每次编译太麻烦。所以就一直用VB。连开发环境都不用安装,从office办公套件直接套用就OK了】

后来让人工智能邦我转换。结果是不能正常使用的,要更改许多地方,尤其是ULONG64、字符串指针、自定义类型struct……

但是给备注,一看就明白。改好后,就能取到正确的数据。粗看我手工编写的与人工智能编写的没有太大区别!看了几遍,也没能发现问题!

放入EXECl表格对比,发现问题了!

ZoneIndices[16] 数据类型是long,惯性思维,给改成byte了,差了太多。所以返回值不正确!

为什么许多API函数返回byte的数据缓冲区,而不是返回真实的数据。主要是考虑兼容性。一个API函数返回值,新、旧函数可能差别很大。但新函数返回数据必须包含旧函数的返回数据,格式完全一样!所以旧程序能完美运行在最新的操作系统中,而不用对老程序进行改写!

大家见笑了。

黄渤海新区能在pagefile.sys文件(for window)检出账号登录的上网记录!试问技术界的天花板也不过如此!

其它技术资料查看本人网站

标签:困扰,struct,ULONG,ADAPTER,下午,数据类型,LH,ADDRESS,PIP
From: https://blog.csdn.net/wjjhyf/article/details/143265878

相关文章

  • Redis学习:十大数据类型、RDB持久化
    Redis学习文章目录Redis学习1.Redis-10大数据类型2.Redis持久化1.Redis-10大数据类型数据类型是value的类型,key的类型都是String数据类型是value的类型,key的类型都是String数据类型是value的类型,key的类型都是String命令不区分大小写,但key是区分大小写的命......