Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2014.02.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.002 c
15-1376690406
Германн
2013-08-17 02:00
2014.02.02
ХЕ4 и WinXP


15-1376375006
[ВладОшин]
2013-08-13 10:23
2014.02.02
Перелогиниться в домене, не закрывая программ. Можно?


15-1377203403
Юрий
2013-08-23 00:30
2014.02.02
С днем рождения ! 23 августа 2013 пятница


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


2-1364238253
Дмитрий С
2013-03-25 23:04
2014.02.02
Как определить является один класс наследником другого?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский