2011-12-10 15 views
5

Sto leggendo Essential COM e ho riscontrato una macro "BASE_OFFSET" dal capitolo 2 del libro e non capisco davvero la sua sintassi o il motivo per cui è stata eseguita in quel modo.Macro BASE_OFFSET da Essential COM

#define BASE_OFFSET(ClassName, BaseName) \ 
(DWORD_PTR(static_cast<BaseName*>(reinterpret_cast<ClassName*>(0x10000000))) - 0x10000000) 

Qualcuno può spiegare questa macro e come la usiamo? In effetti, il libro usa questa macro, ma poiché non la capisco davvero, non ne vedo l'uso pratico. Grazie mille in anticipo.

+0

Grazie per aver modificato la mia domanda. – istudy0

+1

Tra l'altro un'altra macro di Windows standard [FIELD_OFFSET] (http://msdn.microsoft.com/en-us/library/windows/hardware/ff545727 (v = vs.85) .aspx) ottiene l'offset del campo denominato della struttura. – Oleg

+0

grazie per il tuo commento. – istudy0

risposta

7

La macro rende un puntatore fittizio per ClassName con il reinterpret_cast e poi getta al BaseName con l'static_cast.

In presenza di ereditarietà multipla, l'indirizzo di un sottooggetto di classe base non è sempre uguale all'indirizzo dell'indirizzo dell'oggetto. Questo indirizzo possibilmente diverso viene sottratto dall'indirizzo fittizio originale, per ottenere l'offset del subobject BaseName in un oggetto ClassName. È simile a offsetof, ma per sottooggetti di classe base anziché membri.

Diagram showing an example

Questo è utile solo se si sta facendo un po 'brutta roba di basso livello.

+0

Grazie mille per la spiegazione. Il tuo diagramma mi aiuta a visualizzare cosa succede. – istudy0

+0

+1, anche qui è una cosa simile: http://stackoverflow.com/q/5014061/57428 – sharptooth

Problemi correlati