IPhlpapi规格严格

IPhlpapi规格严格,第1张

        在iphlpapi.dll中,有两个很有用的函数,分别是 SendARP、GetAdaptersInfo,它们经常会被用到,但又必须得有iphlpapi.h和iphlpapi.lib才能与vc6进行编译,既然它们是dll中的函数,那当然也能动态地去加载它们了。( 以下的一些地方相对原来的头文件作了修改 : 红色标明 )

        它们的函数指针声明如下:

        typedef DWORD (__stdcall *pGetAdaptersInfo)(PIP_ADAPTER_INFO,unsigned long*); // typedef PULONG unsigned long*
        typedef DWORD (__stdcall *pSendARP)(unsigned long,unsigned long,
         unsigned long*,unsigned long*); //typedef IPAddr unsigned long

        SendARP 根据函数原型来看很容易就可以声明,但 GetAdaptersInfo 就有点麻烦了,它有一个 PIP_ADAPTER_INFO 的结构体,在这个结构体里面也定义了其这的结构体及宏:

#define MAX_ADAPTER_NAME_LENGTH    256
#define MAX_ADAPTER_DESCRIPTION_LENGTH 128
#define MAX_ADAPTER_ADDRESS_LENGTH   8
//
typedef struct
{
char String[4 * 4];
} IP_ADDRESS_STRING, *PIP_ADDRESS_STRING, IP_MASK_STRING, *PIP_MASK_STRING;
//
typedef struct _IP_ADDR_STRING
{
    struct _IP_ADDR_STRING*   Next;
    IP_ADDRESS_STRING    IpAddress;
    IP_MASK_STRING     IpMask;
    DWORD       Context;
} IP_ADDR_STRING, *PIP_ADDR_STRING;
//
typedef struct _IP_ADAPTER_INFO
{
//指向下一个适配器
    struct _IP_ADAPTER_INFO* Next;
    DWORD       ComboIndex;
//适配器名
    char       AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];
//适配器描述
    char       Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];
    UINT       AddressLength;
//适配器MAC
    BYTE       Address[MAX_ADAPTER_ADDRESS_LENGTH];
    DWORD       Index;
    UINT       Type;
    UINT       DhcpEnabled;
    PIP_ADDR_STRING     CurrentIpAddress;
    //适配器IP列表
IP_ADDR_STRING     IpAddressList;
//网关IP列表
    IP_ADDR_STRING     GatewayList;
    IP_ADDR_STRING     DhcpServer;
    BOOL       HaveWins;
    IP_ADDR_STRING     PrimaryWinsServer;
    IP_ADDR_STRING     SecondaryWinsServer;
    long       LeaseObtained;    // typedef time_t long
    long       LeaseExpires;    // typedef time_t long
} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;

        有了上面的定义之后,就可以直接从dll中去加载它们了:

#include <windows.h>

......

pSendARP SendARP;
pGetAdaptersInfo GetAdaptersInfo;
HINSTANCE hInst = NULL;
if(hInst = ::LoadLibrary("iphlpapi.dll"))
{
   SendARP = (pSendARP)::GetProcAddress(hInst,"SendARP");
   GetAdaptersInfo = (pGetAdaptersInfo)::GetProcAddress(hInst,"GetAdaptersInfo");
   // 使用 SendARP、GetAdaptersInfo 函数...
   ::FreeLibrary(hInst);
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/2089776.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-07-22
下一篇 2022-07-22

发表评论

登录后才能评论

评论列表(0条)

保存