• 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);
      }

  • 相关阅读:
    《那些年啊,那些事——一个程序员的奋斗史》——40
    《那些年啊,那些事——一个程序员的奋斗史》——41
    《那些年啊,那些事——一个程序员的奋斗史》——42
    《那些年啊,那些事——一个程序员的奋斗史》——40
    《那些年啊,那些事——一个程序员的奋斗史》——41
    《那些年啊,那些事——一个程序员的奋斗史》——42
    《那些年啊,那些事——一个程序员的奋斗史》——40
    箭牌卫浴(帮朋友发的广告贴)
    Playing with ptrace
    [open source]通过汉字得到拼音的函数库(getpinyin)发布
  • 原文地址:https://www.cnblogs.com/diyunpeng/p/2320046.html
Copyright © 2020-2023  润新知