Можно подумать за 11 лет в ole появилось что-то новое
Но тем не менее я заметил тут одну интересную фишку, значительно облегчающую subj для activex, написанных с применением mfc
Возьмем например запущенный случай - AcroPDF.dll от империи зла, которая сроду никому и никогда .pdb от своих [censored] продуктов не дает
Например довольно скоро можно заметить примерно такую табличку (особенно быстро таблица находится если искать IID IDispatch, IViewObjectEx и прочих must implement интерфейсов):
off_1003C540 dd offset IID_IAcroAXDocShim
dd 78h
dd 1
dd offset IID_IDispatch
dd 78h
dd 1
dd offset IID_IViewObjectEx
dd 0A4h
dd 1
dd offset IID_IViewObject2
dd 0A4h
dd 1
dd offset IID_IViewObject
dd 0A4h
dd 1
dd offset IID_IOleInPlaceObject
dd 84h
dd 1
dd offset IID_IOleInPlaceActiveObject
dd 88h
dd 1
dd offset IID_IOleControl
dd 0A0h
dd 1
dd offset IID_IOleObject
dd 80h
dd 1
dd offset IID_IDataObject
dd 7Ch
dd 1
dd offset IID_IOleInPlaceObjectWindowless
dd 84h
dd 1
dd offset IID_IOleWindow
dd 84h
dd 1
dd offset IID_IPersistStreamInit
dd 94h
dd 1
dd offset IID_IPersistMoniker
dd 9Ch
dd 1
dd offset IID_IPersistPropertyBag
dd 98h
dd 1
dd offset IID_ISupportErrorInfo
dd 0A8h
dd 1
dd offset IID_IConnectionPointContainer
dd 0ACh
dd 1
dd offset IID_ISpecifyPropertyPages
dd 0B0h
dd 1
dd offset IID_IQuickActivate
dd 0B4h
dd 1
dd offset IID_IProvideClassInfo
dd 0B8h
dd 1
dd offset IID_IProvideClassInfo2
dd 0B8h
dd 1
dd offset IID_IOleDocument
dd 8Ch
dd 1
dd offset IID_IOleDocumentView
dd 90h
dd 1
dd offset IID_IOleCommandTarget
dd 0BCh
dd 1
dd offset IID_IObjectSafety
dd 0C8h
dd 1
dd offset IID_IPersistFile
dd 0C4h
dd 1
dd offset IID_IPersist
dd 0C4h
dd 1
dd offset IID_IMonikerProp
dd 0C0h
dd 1
Ссылки на IID я переименовал по их именам (не вручную есс-но)
Например что можно заметить из этой таблицы ? Вот скажем IID_IAcroAXDocShim и IID_IDispatch имеют одинаковое значение во втором поле - 0x78, что логично - IAcroAXDocShim унаследован от IDispatch. Аналогично IOleInPlaceObjectWindowless унаследован от IOleInPlaceObject, который унаследован от IOleWindow
А чтобы пазл сошелся - приведу кусочек конструктора, который расставляет vtbl интерейсов по местам:
mov dword ptr [eax], offset off_1003C524
mov ecx, [ebp+var_4]
mov dword ptr [ecx+48h], offset off_1003C510
mov edx, [ebp+var_4]
mov dword ptr [edx+6Ch], offset off_1003C4EC
mov eax, [ebp+var_4]
mov dword ptr [eax+78h], offset off_1003C44C ; IAcroAXDocShim vtbl
mov ecx, [ebp+var_4]
mov dword ptr [ecx+7Ch], offset off_1003C418
mov edx, [ebp+var_4]
mov dword ptr [edx+80h], offset off_1003C3B4
mov eax, [ebp+var_4]
mov dword ptr [eax+84h], offset off_1003C380
mov ecx, [ebp+var_4]
mov dword ptr [ecx+88h], offset off_1003C354 ; IOleInPlaceActiveObject vtbl
mov edx, [ebp+var_4]
mov dword ptr [edx+8Ch], offset off_1003C338 ; IOleDocument vtbl
mov eax, [ebp+var_4]
mov dword ptr [eax+90h], offset off_1003C2F4 ; IOleDocumentView vtbl
mov ecx, [ebp+var_4]
mov dword ptr [ecx+94h], offset off_1003C2CC
mov edx, [ebp+var_4]
mov dword ptr [edx+98h], offset off_1003C2AC ; IPersistPropertyBag vtbl
mov eax, [ebp+var_4]
mov dword ptr [eax+9Ch], offset off_1003C284 ; IPersistMoniker vtbl
mov ecx, [ebp+var_4]
mov dword ptr [ecx+0A0h], offset off_1003C264
mov edx, [ebp+var_4]
mov dword ptr [edx+0A4h], offset off_1003C224
mov eax, [ebp+var_4]
mov dword ptr [eax+0A8h], offset off_1003C20C
mov ecx, [ebp+var_4]
mov dword ptr [ecx+0ACh], offset off_1003C1F4
mov edx, [ebp+var_4]
mov dword ptr [edx+0B0h], offset off_1003C1E0
mov eax, [ebp+var_4]
mov dword ptr [eax+0B4h], offset off_1003C1C4
mov ecx, [ebp+var_4]
mov dword ptr [ecx+0B8h], offset off_1003C1AC
mov edx, [ebp+var_4]
mov dword ptr [edx+0BCh], offset off_1003C194
mov eax, [ebp+var_4]
mov dword ptr [eax+0C0h], offset off_1003C180
mov ecx, [ebp+var_4]
mov dword ptr [ecx+0C4h], offset off_1003C158
mov edx, [ebp+var_4]
mov dword ptr [edx+0C8h], offset off_1003C140
Все понятно, да ?
Для интересующихся почему это именно так рекомендую покурить afxwin.h из хидеров atlmfc на предмет макросов BEGIN_INTERFACE_PART, INIT_INTERFACE_PART, END_INTERFACE_PART и структуры AFX_INTERFACEMAP_ENTRY
Спасибо! Пригодилось )
ОтветитьУдалить