Einzelnen Beitrag anzeigen

Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: D3D9 Hook bzw. als "proxy.dll"

  Alt 25. Okt 2009, 20:22
Ich schreibe das jetzt mal ohne Testen herunter. Deine Klasse dürfte ungefähr so aussehen:
Delphi-Quellcode:
TMyDirect3D9 = class(TInterfacedObject, IDirect3D9)
private
  fOrgDirect3D9: IDirect3D9;
public
  constructor Create(org: IDirect3D9);
  
  //Diese Prozedur einfach an fOrgDirect3D9.Direct3DProc1 weiterleiten
  procedure Direct3DProc1;
  procedure Direct3DProc2;
  //...
end;
Deine exportierte Funktion muss dann so aussehen:
Delphi-Quellcode:

var MyDirect3D9: IDirect3D9;

function Direct3DCreate9(SDKVersion: LongWord): Pointer;
begin
  if MyDirect3D9 = nil then
    MyDirect3D9 := TMyDirect3D9.Create(Direct3DCreate9original(SDKVersion));
  
  //Jetzt einmal den RefCount erhöhen
  MyDirect3D9._AddRef;
  return Pointer(MyDirect3D9);
end;
Dieses RefCount-Gemurkse ist nur deshalb notwendig, weil die Entwickler von Direct3D sich anscheinend nicht an COM-Regeln gehalten haben. Normalerweise gilt nämlich, dass man Interfaces nie als Rückgabewert, sondern nur als out-Parameter zurückgibt. Dann ergeben sich auch keine Probleme.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat