• 0
Pax Beach

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

Вопросы

Привожу пример готового 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

0 ответов на этот вопрос

Ответы на этот вопрос пока отсутствуют

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От SIARHEI RAHOUSKI
      Создал проект там куча компонентов. Но разворачивании формы на весь экран компоненты размер не меняют:
      Прочитал про свойства align Но как только я выставлю Group box например left другим right все сбивается в кучу и поправить это не могу. 
      Как настроить align ?

    • От SIARHEI RAHOUSKI
      Как сделать форму с компонентами под все разрешения?

    • От SIARHEI RAHOUSKI
      Как сделать мозаику (drag/drop) ? Получается есть 2 прямоугольника (которые надо перетаскивать)  и есть ещё 2 прямоугольника (которые должны принимать) и ещё есть кнопка проверки. При нажатии определяет правильно ли разместили прямоугольники.
    • От SIARHEI RAHOUSKI
      Как задать градиентную заливку TChart? именно самих столбцов. 

    • От SIARHEI RAHOUSKI
      При нажатии на Label действия не происходят
      procedure TForm2.Label11Click(Sender: TObject);
      begin
      Button1.visible:= true;
      {label7.Font.Style:= [];
      label8.Font.Style := [];
      label9.Font.Style := [];
      //label11.Font.Style := [fsbold];
      label10.Font.Style := [];  }

        GroupBox12.Visible := false;
        GroupBox13.Visible := false;
        GroupBox14.Visible := false;
        GroupBox15.Visible := true;
        GroupBox16.Visible := false;
      end;
    • От Edward Tarasov
      поставил этот патч 
      https://cc.embarcadero.com/item/30805
      Версия PAserver на mac стала - 10.1.1.37, test connection отвечает success, но при компиляции выдаеться ошибка - [PAClient Error] Error: E0014 Connection refused. Platform Assistant Server version mismatch - expecting version '10.0.1.23'. 
      10.0.1.23 - это старая версия PA... откатиться нельзя ибо не пашет, тоесть этот патч исправляет старую проблему - но добавляет эту... суть в том, как я понял после 4-х часовго гугления, что надо исправить PAclient, у которого версия почему то осталась старая... кто знает как с этим быть?
    • От Edward Tarasov
      Чего то под конец написания диплома, вылазиет все больше и больше ошибок... еще одна!
      Удалил не нужный layout - теперь пишет -'asentor for bron not found' , и так со всем чтобы не удалил - причем под винду компилиться норм, а с ведройдом беда! кто то сталкивался?
    • От Edward Tarasov
      Подскажите плз студенту, весь инет перерыл - ничего кроме tmapview не нашел, и тот позволяет только отображать маркеры и прокладывать через них маршрут... ок маршрут проложили а как включить навигацию? чтобы телка сказала - поверни те туда то.... не ясно, и возможно ли вообще такое? 
      Кстатить при использовании tmapview вместо карты - пустой экран.
      вообщем надо передать в tmapview мое местоположение и куда надо идти, затем включить навигацию
      Кто занет как сделать ?????????
      Или может есть возможность использовать встроенные возможности навигации?
    • От AliZairov
      Привет. Я сделал новую версию YouTubeApi компоненты. Поддерживаемые VCL & FMX + Mobile.
      Никаких официальных YouTube Api компоненты. Только данные с парсинг. Пример доступен в архиве.
       
      Новый
      ===
      v1.4 - 25/02/2018
        + Устранение проблем
      YouTubeApiDelphi
    • От Edward Tarasov
      Такая проблема... прога на андройд - два лэйаута в первом просто кнопки, во втором браузер. до тех пор пока второй лэйаут с браузером не открыли - кнопки в первом нажимаются - как только открыли браузер и закрыли его(visible:=false(и лэйаут и браузер)) кнопки в первом всеравно не нажимаются, как будто нажимаю на пустой лайаут, при том что сами кнопки на форме видно.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу