我正在努力将在Visual c + + 6.0中创建的旧C Windows驱动程序项目导入到visual studio 2012中。结构的定义方式在vs2012中导致错误。
typedef struct {
LINK Link;
HANDLE hFile;
BYTE handleType;
OVERLAPPED Overlapped;
CRITICAL_SECTION csIoCtrl;
} USB_HANDLE, *PUSB_HANDLE;
typedef struct {
USB_HANDLE; //error occurs here saying nothing was declared for USB_HANDLE
LIST PipeList;
BOOL bRemoved;
CRITICAL_SECTION csPipeList;
SP_DEVICE_INTERFACE_DETAIL_DATA *InterfaceData;
} USB_DEVICE, *PUSB_DEVICE;
该项目然后使用类似的调用 USB_DEVICE mydevice; mydevice-> hfile = handle;
这种类型的结构在vs2012中是否可行?
(编辑 - 虽然这些确实显示为错误,但Visual Studio 2012确实编译并成功构建了一个解决方案。我将测试驱动程序,看看一切是否能很快正常运行。)
错误:
struct declaration error message http://oi45.tinypic.com/wb877k.jpg
member error message http://oi46.tinypic.com/jhts1f.jpg
我认为可以使用的解决方法是制作USB_DEVICE结构:
typedef struct {
USB_HANDLE USB_HANDLE;
LIST PipeList;
BOOL bRemoved;
CRITICAL_SECTION csPipeList;
SP_DEVICE_INTERFACE_DETAIL_DATA *InterfaceData;
} USB_DEVICE, *PUSB_DEVICE;
然后我可以进行其余的通话: mydevice-> USB_HANDLE.hfile = handle;
这是一个等同的陈述吗?
答案 0 :(得分:1)
定义一个宏来声明USB_HANDLE
,然后在两者中使用它。像,
#define HANDLE_BODY \
LINK Link; \
HANDLE hFile; \
BYTE handleType; \
OVERLAPPED Overlapped; \
CRITICAL_SECTION csIoCtrl;
typedef struct {
HANDLE_BODY
} USB_HANDLE, *PUSB_HANDLE;
typedef struct {
HANDLE_BODY
LIST PipeList;
BOOL bRemoved;
CRITICAL_SECTION csPipeList;
SP_DEVICE_INTERFACE_DETAIL_DATA *InterfaceData;
} USB_DEVICE, *PUSB_DEVICE;
如果您还需要,可以创建union
。否则,您可能需要一些特殊的非标准编译器选项。例如,许多编译器支持transparent_union
,这也将解决您的问题。但是,我不认为Visual C ++支持这一点。但也许更了解这些产品的人可以提供帮助。
答案 1 :(得分:0)
似乎USB_DEVICE中的USB_HANDLE类型没有定义任何变量。
typedef struct {
USB_HANDLE handler; // handler is missing?
LIST PipeList;
BOOL bRemoved;
CRITICAL_SECTION csPipeList;
SP_DEVICE_INTERFACE_DETAIL_DATA *InterfaceData;
} USB_DEVICE, *PUSB_DEVICE;