Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.02.02;
Скачать: CL | DM;

Вниз

Интерфейсы   Найти похожие ветки 

 
ttt   (2013-03-28 17:02) [0]

Добрый день.

Как отследить вызов функций интерфейса, созданного вне моего приложения?

Сейчас пробую так:
function Direct3DCreate9(SDKVersion: LongWord): Pointer;
begin
result:= _Direct3DCreate9(SDKVersion);
if Assigned(result) then begin
 result:= TDirect3D9.Create(result);
 Writeln("call d3d9.dll:Direct3DCreate9(", SDKVersion, ") = ", Cardinal(result), " - overridden");
end else
 Writeln("call d3d9.dll:Direct3DCreate9(", SDKVersion, ") = ", Cardinal(result));
end;

Где TDirect3D9:
 TDirect3D9 = class(TInterfacedObject, IDirect3D9)
 private
   D3D9: IDirect3D9;
 public
   function RegisterSoftwareDevice(pInitializeFunction: Pointer): HResult; stdcall;
   function GetAdapterCount: LongWord; stdcall;
   function GetAdapterIdentifier(Adapter: LongWord; Flags: DWord; out pIdentifier: TD3DAdapterIdentifier9): HResult; stdcall;
   function GetAdapterModeCount(Adapter: LongWord; Format: TD3DFormat): LongWord; stdcall;
   function EnumAdapterModes(Adapter: LongWord; Format: TD3DFormat; Mode: LongWord; out pMode: TD3DDisplayMode): HResult; stdcall;
   function GetAdapterDisplayMode(Adapter: LongWord; out pMode: TD3DDisplayMode): HResult; stdcall;
   function CheckDeviceType(Adapter: LongWord; CheckType: TD3DDevType; AdapterFormat, BackBufferFormat: TD3DFormat; Windowed: BOOL): HResult; stdcall;
   function CheckDeviceFormat(Adapter: LongWord; DeviceType: TD3DDevType; AdapterFormat: TD3DFormat; Usage: DWord; RType: TD3DResourceType; CheckFormat: TD3DFormat): HResult; stdcall;
   function CheckDeviceMultiSampleType(Adapter: LongWord; DeviceType: TD3DDevType; SurfaceFormat: TD3DFormat; Windowed: BOOL; MultiSampleType: TD3DMultiSampleType; pQualityLevels: PDWORD): HResult; stdcall;
   function CheckDepthStencilMatch(Adapter: LongWord; DeviceType: TD3DDevType; AdapterFormat, RenderTargetFormat, DepthStencilFormat: TD3DFormat): HResult; stdcall;
   function CheckDeviceFormatConversion(Adapter: LongWord; DeviceType: TD3DDevType; SourceFormat, TargetFormat: TD3DFormat): HResult; stdcall;
   function GetDeviceCaps(Adapter: LongWord; DeviceType: TD3DDevType; out pCaps: TD3DCaps9): HResult; stdcall;
   function GetAdapterMonitor(Adapter: LongWord): HMONITOR; stdcall;
   function CreateDevice(Adapter: LongWord; DeviceType: TD3DDevType; hFocusWindow: HWND; BehaviorFlags: DWord; pPresentationParameters: PD3DPresentParameters; out ppReturnedDeviceInterface: IDirect3DDevice9): HResult; stdcall;

   constructor Create(_D3D9: pointer);
 end;


 
ttt   (2013-03-28 17:04) [1]


> function TDirect3D9.CreateDevice(Adapter: LongWord; DeviceType:
>  TD3DDevType; hFocusWindow: HWND; BehaviorFlags: DWord;
> pPresentationParameters: PD3DPresentParameters; out ppReturnedDeviceInterface:
>  IDirect3DDevice9): HResult;
> begin
> Writeln("!");
> result:= D3D9.CreateDevice(Adapter, DeviceType, hFocusWindow,
>  BehaviorFlags, pPresentationParameters, ppReturnedDeviceInterface);
>
> end;
>
> constructor TDirect3D9.Create(_D3D9: pointer);
> begin
> D3D9:= IDirect3D9(_D3D9);
> end;

Ну и т.д.
В итоге данные махинации приводят к крашу.


 
ttt   (2013-03-28 17:14) [2]

Я так понимаю в получатель вызываются функции по порядку интерфейса, а меня по этим адресам всякая лажа для работы с классами. Или я не прав?


 
ttt   (2013-03-28 17:33) [3]

Извиняйте за панику.

 result:= Pointer(IDirect3D9(TDirect3D9.Create(result)));


 
ttt   (2013-03-29 16:12) [4]

И вот я продвинулся немного дальше, а вопросы интерфейсов всё никак не разрешатся.

function TDirect3DDevice9.SetTexture(Stage: DWord; pTexture: IDirect3DBaseTexture9): HResult;
var
 si: _D3DSURFACE_DESC;
begin
if Assigned(pTexture) and (pTexture.GetType = D3DRTYPE_TEXTURE) then begin
 IDirect3DTexture9(pTexture).GetLevelDesc(0, si);
 
end;
result:= D3DDevice9.SetTexture(Stage, pTexture);
end;

Здесь я пытаюсь узнать размер текстуры. Как показывает IDirect3DResource9.GetType это действительно IDirect3DTexture9. Но при попытке вызвать IDirect3DTexture9.GetLevelDesc ошибка. В чем проблема?


 
Sapersky   (2013-03-29 17:36) [5]

Такое что ли нужно?
http://forum.sources.ru/index.php?showtopic=339598



Страницы: 1 вся ветка

Текущий архив: 2014.02.02;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.008 c
15-1376633325
БарЛог
2013-08-16 10:08
2014.02.02
Советы по организации почтового ящика


2-1364333792
znt
2013-03-27 01:36
2014.02.02
Вероятность победы + random


2-1364475755
ttt
2013-03-28 17:02
2014.02.02
Интерфейсы


15-1376690406
Германн
2013-08-17 02:00
2014.02.02
ХЕ4 и WinXP


15-1376466247
Разведка
2013-08-14 11:44
2014.02.02
Зачем формы размещают в *.dll