Forum: Multimedia
Delphi
by Apollonius,
28. Okt 2009
Die Variable pmyIDirect3D9 muss den Typen IDirect3D9 haben! Sonst gibst du den falschen Zeiger zurück. Daneben solltest du AddRef und Release einfach von TInterfacedObject erben und nicht verändern.
Forum: Multimedia
Delphi
by Apollonius,
27. Okt 2009
Ich glaube nicht. :mrgreen: Wird aber nicht funktionieren, weil, wie Remko und ich festgestellt haben, Delphi da etwas anderes draus bastelt.
Forum: Multimedia
Delphi
by Apollonius,
27. Okt 2009
Stimmt, das stdcall fehlt - sehr seltsam. Register ist es allerdings auf keinen Fall.
Forum: Multimedia
Delphi
by Apollonius,
27. Okt 2009
Naja, die C++-Deklaration sieht so aus:
IDirect3D9 * Direct3DCreate9(
UINT SDKVersion
);
Und wenn ich in Delphi schreibe
function Direct3DCreate9(SDKVersion: Cardinal): IDirect3D9; stdcall;
Forum: Multimedia
Delphi
by Apollonius,
27. Okt 2009
Was heißt denn jetzt "funktioniert nicht"? Hast du das mal debuggt?
Christian, der Funktionsprototyp darf nicht verändert werden. Wenn man als Result ein Interface, dynamisches Array, String oder Variant verwendet, wird intern ein out-Parameter verwendet - man verändert also die Aufrufkonvention.
Forum: Multimedia
Delphi
by Apollonius,
25. Okt 2009
Ich schreibe das jetzt mal ohne Testen herunter. Deine Klasse dürfte ungefähr so aussehen:
TMyDirect3D9 = class(TInterfacedObject, IDirect3D9)
private
fOrgDirect3D9: IDirect3D9;
public
constructor Create(org: IDirect3D9);
//Diese Prozedur einfach an fOrgDirect3D9.Direct3DProc1 weiterleiten
procedure Direct3DProc1;
Forum: Multimedia
Delphi
by Apollonius,
25. Okt 2009
Du schreibst selbst eine Klasse, die IDirect3D9 implementiert. AddRef und Release kannst du implementieren, indem du von TInterfacedObject ableitest, QueryInterface wahrscheinlich auch, und den Rest schreibst du entweder selbst oder delegierst an das ursprüngliche IDirect3D9. In deiner Direct3DCreate9-Funktion gibst du dann nicht mehr das ursprüngliche Interface zurück, sondern eine Instanz...