2009-09-29 157 views
4

我正在编写使用WinUsb.dll与Usb设备进行通信的应用程序。这是一个用户模式库,它允许通过安装在内核中的驱动程序winusb.sys与设备进行通信。编译使用WinUsb的应用程序

我写在C++这个应用程序与Visual Studio 2008

头WinUsb.h在Windows DDK中发现,所以我添加包含路径“d:\ WINDDK \ 7100.0.0 \ INC \ DDK ”。然后我得到一个错误,发现Usb.h不能被WinUsb.h包含,Usb.h也在ddk中,但在一个不同的目录中,所以我添加了“D:\ WinDDK \ 7100.0.0 \ inc \ api”作为一个包含目录。

一旦我添加该路径,然后一切都进入厕所,我开始在stdio.h和一堆其他奇怪的地方得到编译错误。

我真的不想使用DDK构建系统和编译器,以便简单地使用这个DLL,这是我使用WinUsb而不是写一个正确的驱动程序的主要原因之一。

是否有人使用WinUsb.dll和Visual Studio构建了一个应用程序?

回答

4

我正在编写一个跨平台的USB库,使用DDK构建环境会使我的构建过程变得更加复杂。

WinUsb是为客户端应用程序用于加载WinUsb.sys作为其驱动程序的设备。但是,似乎没有打包用于用户模式程序(不包括UMDF驱动程序)的WinUsb头文件。

我最终做的是将几个支持winusb.h的头文件从DDK中拷贝到私有目录中,然后在构建过程中将该目录作为包含目录引用。

这些都是我需要复制的标题:

POPPACK.h 
PSHPACK1.h 
usb.h 
usb100.h 
usb200.h 
winusb.h 
winusbio.h 

有一次,我这些包含在专用目录和我能够编译,并在Visual Studio中运行我的项目在DDK与winusb.lib链接。

我不知道我是否会推荐这种方法,因为当DDK版本之间的头文件发生变化时,它可能会变得很糟糕,但是我会打开一个CONNECT错误以查看是否可以让MS创建一个WinUsb头文件包用于客户端用户模式应用程序。

+1

如果这是“正确”的方式,不知道。至少它似乎有效......这真的很可怕。 – 2013-10-15 14:18:14

+2

这似乎很适合所讨论的平台上的“正确”;)确实,它起作用! – Magnus 2014-09-12 08:02:40

1

从历史上看,DDK和SDK并没有很好的结合在一起,但是这个问题在Vista发布之前就已经解决了。但是,您似乎可能会将某个SDK的某些部分与另一个SDK混合在一起,这并不好。我要么使用DDK编译环境,要么至少查看DDK环境设置的INCLUDE路径,并在VS项目设置中将其复制到,确切地说是

注意,您可以使用DDK构建环境,仍然通过创建一个“生成文件项目”使用VS IDE或者您可能能够使用像OSR的或Hollistech的DDKBUILD工具:

我没有使用过这些,所以我不知道他们是如何很好地工作,但要注意的是,尽管他们的名称相似,并使用它们是不同的工具。

+0

Michael,谢谢你花时间回答我的问题。我还听说,DDK和SDK的网格划分工作已经完成,但正如你所说的,某些东西似乎有冲突。我很害怕我对这个问题的回应会告诉我必须使用DDK构建环境。我以一种肮脏的方式解决了这个问题,我将作为答案发布。 – joshperry 2009-10-03 17:55:06