用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