在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);
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)