2011-10-24 13 views

回答

-1

我做到了像MSalters建議:

std::vector<char> rawbuf(sizeof (SP_DEVICE_INTERFACE_DETAIL_DATA) + bufferlen); 
SP_DEVICE_INTERFACE_DETAIL_DATA* pDIDD = 
     reinterpret_cast<SP_DEVICE_INTERFACE_DETAIL_DATA*>(&rawbuf[0]); 

編輯:

繼Raymond Chen的例子(如討論on his blog),我可以如下分配SP_DEVICE_INTERFACE_DETAIL_DATA結構:

PSP_DEVICE_INTERFACE_DETAIL_DATA pDIDD = 
    malloc(FIELD_OFFSET(SP_DEVICE_INTERFACE_DETAIL_DATA, 
         DevicePath[bufferlen])); 
+1

Eh,不,這個'malloc'應該和'free'匹配,但是'std :: unique-ptr'會調用'd elete'。更簡單:'std :: vector rawbuf(sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA)+ bufferlen); SP_DEVICE_INTERFACE_DETAIL_DATA * ptr = reinterpret_cast (&rawbuf [0]);' – MSalters

+0

@ MSalters:謝謝指出。你可以讓這個答案,然後我可以刪除我的錯誤的職位,並接受你的。 –

+1

該技術提供了所需的緩衝區大小,但問題在於所需的數組長度。實際需要的大小是'FIELD_OFFSET(SP_DEVICE_INTERFACE_DETAIL_DATA,DevicePath [arraysize])'。還要注意'std :: vector '只保證'char'-alignment,這比'SP_DEVICE_INTERFACE_DETAIL_DATA'對齊要弱。您可能會在某些處理器上發生對齊錯誤。 –