我有一个由VS2010生成的通用SDI应用程序,我想用它来测试WinUsb API。我安装了当前版本的WDK。根据帖子我读过elesewhere,我应该能够设置VS2010项目包含路径指向WDK并添加包含WinUsb.h来执行此操作。所以我把它添加到stdafx.h中,如下所示
#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions
#include <Winusb.h>
但是当我编译时,我得到了错误
1>c:\winddk\7600.16385.1\inc\api\usb200.h(93): error C2332: 'struct' : missing tag name
1>c:\winddk\7600.16385.1\inc\api\usb200.h(93): error C2011: '<unnamed-tag>' : 'enum' type redefinition
1> c:\program files (x86)\microsoft sdks\windows\v7.0a\include\htmlhelp.h(331) : see declaration of '<unnamed-tag>'
1>c:\winddk\7600.16385.1\inc\api\usb200.h(93): error C2059: syntax error : 'constant'
1>c:\winddk\7600.16385.1\inc\api\usb200.h(93): error C2334: unexpected token(s) preceding '{'; skipping apparent function body
它抱怨的结构是
typedef union _USB_HIGH_SPEED_MAXPACKET {
struct _MP {
USHORT MaxPacket:11; /* 0..10 */
USHORT HSmux:2; /* 11..12 */
USHORT Reserved:3; /* 13..15 */
};
USHORT us;
} USB_HIGH_SPEED_MAXPACKET, *PUSB_HIGH_SPEED_MAXPACKET;
并且IDE已用红色标记了_MP。
答案 0 :(得分:2)
当应用程序配置为使用MBCS时,问题的根源就出现了。
选择MBCS时包含的mbctype.h
内部是一组#define
语句
/* bit masks for MBCS character types */
#define _MS 0x01 /* MBCS single-byte symbol */
#define _MP 0x02 /* MBCS punct */
#define _M1 0x04 /* MBCS 1st (lead) byte */
#define _M2 0x08 /* MBCS 2nd byte*/
#define _SBUP 0x10 /* SBCS upper char */
#define _SBLOW 0x20 /* SBCS lower char */
在包含usb200.h
之前发生。
您既不能选择MBCS(使用Unicode),也可以像Lynn所说的那样选择MBCS,并且可以在上面的行中#undef
。但请将#include
放在列表底部附近以避免意外后果。
答案 1 :(得分:1)
您需要添加:
#undef _MP
在Winusb.h
的包含之前。
我认为这是一个特定于MFC的问题,MFC将其定义为预处理器符号,唯一的解决方法是专门取消定义它,以便正确地写出结构。据说,这有一些其他的副作用,所以需要注意。
答案 2 :(得分:0)
实际上,我的错误不是在WinUsb.h之前的#include
我做出了错误的假设,即MFC标头最终会包含Windows.h,但因为这显然不是设备相关的应用程序。