4

我正在将在 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 =句柄;

这种结构在vs2012中是否可行?

(编辑 - 虽然这些确实显示为错误,但 Visual Studio 2012 确实编译并成功构建了一个解决方案。我将测试驱动程序以查看是否一切正常。)

错误:

结构声明错误信息

会员错误信息

我认为可以使用的解决方法是制作 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;

这是一个等效的陈述吗?

4

2 回答 2

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++ 不支持这一点。但也许对这些产品更了解的人可以提供帮助。

于 2013-04-04T01:00:12.277 回答
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;
于 2013-04-04T04:57:37.253 回答