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.