Неразбериха в стиле C - PullRequest
       1

Неразбериха в стиле C

0 голосов
/ 21 сентября 2011

Я читаю чей-то (общедоступный) исходный код, и я наткнулся на эту строку и понятия не имею, что он делает. Я пытался разложить его, но это всегда приводит меня в замешательство, несмотря на то, что я пытаюсь.

uintptr_t* pInterfaceVTable = (uintptr_t*)*(uintptr_t*)pd3dDevice;

pd3dDevice - это LPDIRECT3DDEVICE9, то есть IDirect3DDevice9*. IDirect3DDevice9 - это класс, который наследует от IUnknown, и оба реализуют набор виртуальных функций.

Может ли кто-нибудь более мирский помочь мне с тем, что делает этот код, построчно?

Большое спасибо за потраченное время!

Ответы [ 3 ]

3 голосов
/ 21 сентября 2011

uintptr_t - это целочисленный тип, который может хранить указатель.

Автор предполагает (знает?), Что первая запись в IDirect3DDevice9 является указателем, поэтому он преобразует IDirect3DDevice9 в (uintptr_t *) и разыменовывает его для доступа к этому указателю. Затем он снова преобразует этот uintptr_t в указатель (в uintptr_t), чтобы назначить его в pInterfaceVTable.
Как упоминалось в комментарии и от AndyT, то есть используемый компилятор хранит указатель на VTable, но это не гарантируется C ++.

1 голос
/ 21 сентября 2011

Кажется, что автор анализирует виртуальную таблицу экземпляра IDirect3DDevice9.Я могу представить себе одну из причин этого - для внедрения кода или перехвата.Можно вставить собственный код в реализацию IDirect3DDevice9, чтобы перехватить вызов его методов по ряду причин, например, для записи игр в виде видео

0 голосов
/ 21 сентября 2011
uintptr_t* pInterfaceVTable = (uintptr_t*)*(uintptr_t*)pd3dDevice;

Похоже, что выполняется приведение к uintptr_t *, затем разыменовывает указатель, а затем преобразует разыменованный результат в uintptr_t *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...