在struct中创建struct

时间:2013-04-04 00:42:35

标签: c++ winapi visual-c++

我正在努力将在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;

这是一个等同的陈述吗?

2 个答案:

答案 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;