2013-04-04 245 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;