在iphlpapi.dll中,有两个很有用的函数,分别是 SendARP、GetAdaptersInfo,它们经常会被用到,但又必须得有iphlpapi.h和iphlpapi.lib才能与vc6进行编译,既然它们是dll中的函数,那当然也能动态地去加载它们了。( 以下的一些地方相对原来的头文件作了修改 : 红色标明 ) 它们的函数指针声明如下: typedef DWORD (__stdcall *pGetAdaptersInfo)(PIP_ADAPTER_INFO,unsigned long*); // typedef PULONG unsigned long* SendARP 根据函数原型来看很容易就可以声明,但 GetAdaptersInfo 就有点麻烦了,它有一个 PIP_ADAPTER_INFO 的结构体,在这个结构体里面也定义了其这的结构体及宏: #define MAX_ADAPTER_NAME_LENGTH 256 有了上面的定义之后,就可以直接从dll中去加载它们了: #include <windows.h> ...... pSendARP SendARP; |
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);
}