2011-12-10 27 views
5

Tôi đọc Essential COM và gặp macro 'BASE_OFFSET' từ chương 2 của cuốn sách và tôi không thực sự hiểu cú pháp của nó hoặc tại sao nó được thực hiện theo cách đó.BASE_OFFSET macro từ Essential COM

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

Bất cứ ai có thể giải thích về macro này và cách chúng tôi sử dụng? Trong thực tế, cuốn sách sử dụng vĩ mô này nhưng vì tôi không thực sự hiểu nó, tôi không thấy việc sử dụng thực tế của nó. Cảm ơn bạn rất nhiều trước.

+0

Cảm ơn bạn đã chỉnh sửa câu hỏi của mình. – istudy0

+1

Bằng cách một macro cửa sổ chuẩn khác [FIELD_OFFSET] (http://msdn.microsoft.com/en-us/library/windows/hardware/ff545727 (v = vs.85) .aspx) giúp bạn bù đắp trường được đặt tên của cấu trúc. – Oleg

+0

cảm ơn nhận xét của bạn. – istudy0

Trả lời

7

Macro tạo thành con trỏ giả thành ClassName bằng reinterpret_cast và sau đó chuyển nó đến BaseName với static_cast.

Khi có nhiều thừa kế, địa chỉ của lớp con cơ sở không phải lúc nào cũng giống như địa chỉ của đối tượng. Địa chỉ có thể khác biệt này được trừ từ địa chỉ giả ban đầu, để lấy giá trị bù trừ của đối tượng BaseName trong đối tượng ClassName. Nó tương tự như offsetof, nhưng đối với các lớp con cấp cơ sở thay vì các thành viên.

Diagram showing an example

này chỉ hữu ích nếu bạn đang thực hiện một số nội dung ở mức độ thấp khó chịu.

+0

Cảm ơn bạn rất nhiều vì đã giải thích. Sơ đồ của bạn giúp tôi hình dung những gì diễn ra. – istudy0

+0

+1, đây cũng là một điều tương tự: http://stackoverflow.com/q/5014061/57428 – sharptooth

Các vấn đề liên quan