Posted on 2011-06-16 10:00
托雷宽 阅读(1375)
评论(1) 编辑 收藏 引用 所属分类:
Visual C++
WinPcap的使用说明网上也有不少,这里仅作学习过程的记录。
首先,从官方下载了较新的开发包WpdPack_4_0_2,里面有不少的例子。不过都是VC6.0的,而我想要开发的环境是VS2008。
WinPcap解压后有5个文件夹,其中Lib和Include两个要包含在工程中。方法如下:
1)项目->属性->配置属性->链接器->常规->附加库目录,加入Lib所在路径;
2)项目->属性->配置属性->链接器->输入->附加依赖项,加入wpcap.lib与Packet.lib两个静态链接库;
3)项目->属性->配置属性->C/C++->常规->附加包含目录,加入Include所在路径。
接着,我参考了http://www.smatrix.org/bbs/read.php?tid=358&fpage=4里头的步骤开始获取网络驱动。结果很不幸地出现了一些莫名其妙的错误:
1>c:\program files\microsoft sdks\windows\v6.0a\include\netioapi.h(155) : error C2146: 语法错误 : 缺少“;”(在标识符“PhysicalMediumType”的前面)。
错误发生在 NDIS_PHYSICAL_MEDIUM PhysicalMediumType 这一句上。网上有一些解析,说这是因为VS2008对ntddndis.h里头的定义比较新,WinPcap的头文件在对ntddndis.h的编译过后没有获得相应的定义,因此NDIS_PHYSICAL_MEDIUM不是一个结构或类,所以就产生了缺少“;”这样奇怪的错误。把netioapi.h里的#include <ntddndis.h>改为#include "ntddndis.h"后终于通过编译,改为" "后项目则从包括的文件中先查找头文件的定义,若找不到再从默认路径中查找。(网上查到的解析是:<>先去系统目录中找头文件,如果没有在到当前目录下找。而""首先在当前目录下寻找,如果找不到,再到系统目录中寻找。因此我猜想Include文件夹里头的ntddndis.h有NDIS_PHYSICAL_MEDIUM的定义。再查看了一下Include文件夹里的ntddndis.h,也没发现,但在查看c:\program files\microsoft sdks\windows\v6.0a\include\下的ntddndis.h时竟然发现有NDIS_PHYSICAL_MEDIUM的定义!!! 是不是我对系统目录的概念理解有误呢?假如把Include(WinPcap中)里的头文件删了,再改回<>可以通过编译的话,那么就说明在用<>的情况下查找的顺序应该是先查Include文件夹再查默认路径。一试之下竟然应验了。于是再去搜了一个尖括号与双引号的区别,这个解析得比较清晰:
双引号时,系统先在引用被包含文件的源文件所在的文件目录中寻找要包含的文件,若找不到,再按系统指定的标准方式检索其他目录。尖括号时,不检查原文件所在的文件目录,而直接按系统标准方式检索文件目录。这样子就能解析发生了什么问题,因为发生错误的是在netioapi.h的头文件里,而这个头文件是在c:\program files\microsoft sdks\windows\v6.0a\include\下,所以在用<>时项目没有直接查与netioapi.h同一目录下的ntddndis.h,而是直接查到了Include头上。