2013-04-04 139 views
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 = 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;

这是一个等价的语句吗?

+3

您可以通过给一个名字在USB_DEVICE的USB_HANDLE解决这个问题。 – 2013-04-04 00:45:11

+0

我们不应该问清楚错误消息是什么,因为它应该在第一句中:“我在VS2012中收到以下错误消息:...”。请使用这些重要信息来启发我们。 – Sebivor 2013-04-04 01:38:59

回答

1

定义一个宏来声明USB_HANDLE然后在两者中使用它。 Like,

#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

您可能还想对该问题发表评论。我不会推荐这个新代码,但它可以让你解决这个问题,至少让系统运行新的工具。 – 2013-04-04 01:07:55

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;