IPhlpapi 规格严格

        在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://hi.baidu.com/hiliqirun/blog/item/b7f3d881b42084dc9123d9d6.html

 typedef   DWORD   (CALLBACK*   SendARPFUNC)(IN_ADDR   DestIP,   //   目标IP地址
                      IN_ADDR   SrcIP,     //   源IP地址
                      PULONG   pMacAddr,   //   返回MAC地址指针
                      PULONG   PhyAddrLen   //   返回MAC地址长度
                      );


  HINSTANCE   m_hInstIPHlpAPI;
  SendARPFUNC   SendARP;


  CString   strErr;
  m_hInstIPHlpAPI   =   LoadLibrary(_T( "iphlpapi.dll "));
  if   (m_hInstIPHlpAPI   ==   NULL)   {
    strErr.Format(_T( "加载iphlpapi.dll失败!程序不能正常启动!\r\n错误代码:%d "),   GetLastError());
    AfxMessageBox(strErr);
    PostQuitMessage(0);
  }
  //   加载SendARP函数
  SendARP   =   (SendARPFUNC)GetProcAddress(m_hInstIPHlpAPI,   "SendARP ");
  if   (SendARP   ==   NULL)   {
    strErr.Format(_T( "加载SendARP函数失败!!程序不能正常启动!\r\n错误代码:%d "),   GetLastError());
    AfxMessageBox(strErr);
    PostQuitMessage(0);
  }

原文地址:https://www.cnblogs.com/diyunpeng/p/2320046.html