Перейти к содержанию
Fire Monkey от А до Я
  • 0

Получить метод интерфейса по указателю на интерфейс, на готовом примере приложения DirectX


Pax Beach

Вопрос

Привожу пример готового FMX приложения, которое рисует на форме с помощью интерфейса IDirect3DDevice9.

В примере реализован вызов анонимного метода Present() интерфейса IDirect3DDevice9, имея ссылку на интерфейс и порядковый номер метода.

Данная реализация пригодится при установке ловушек (Hooks).

 

Вкратце, суть реализации такая:

Объявляю процедурный тип нужного метода

type
  TPresent9 = function(pSourceRect, pDestRect: PRect; hDestWindowOverride: HWND; pDirtyRegion: PRgnData): HResult of object; stdcall;

Объявляю переменную этого типа

var
  PPresent: TPresent9;
begin
  ...
  IntRefToMethPtr(d3d9Dev, PPresent, 17);
  PPresent(nil, nil, DParametrs.D3DPP.hDeviceWindow, nil);

Реализую процедуру получения метода интерфейса по номеру

procedure IntRefToMethPtr(const IntRef; var MethPtr; MethNo: Integer);
type
  TVtable  = array [0 .. 999] of Pointer;
  PVtable  = ^TVtable;
  PPVtable = ^PVtable;
begin
  // QI=0, AddRef=1, Release=2, etc
  TMethod(MethPtr).Code := PPVtable(IntRef)^^[MethNo];
  TMethod(MethPtr).Data := Pointer(IntRef);
end;

А теперь получаем метод интерфейса по его порядковому номеру и вызываем его

  IntRefToMethPtr(d3d9Dev, PPresent, 17);
  PPresent(nil, nil, DParametrs.D3DPP.hDeviceWindow, nil);

Благодарю за оценку этого решения на StackOverflow.

 

Скачать пример: D3DDemo.zip

Ссылка на комментарий

Рекомендуемые сообщения

Ответов пока нет

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...