Hi !
Nach dem ich (auch unter Mithilfe hier aus dem Board) erfolgreich eine DX9-Proxydll geschrieben habe, wollte ich mich nun an DX10 machen.
Bisher funktioniert auch alles tadellos.... bis zu einem gewissen Punkt.
Aber der Reihe nach:
1. Ich fange den Aufruf "CreateDevice" an die d3d10.dll ab und gebe meine eigene Klasse von ID3D10Device weiter.
2. Es wird ein QueryInterface von IDXGIDevice gefordert welches auch durch eine eigene Klasse ersetz wurde.
3. Es werden diverse weiter, mir unbekannte, TGUID angefordert die allerdings von der original
DLL ebenfalls mit
NIL beantwortet werden und somit offenbar keinen Einfluß auf den weiteren Verlauf haben.
4. Von der IDXGIDevice-Klasse wird per "GetParent" ein IDXGIAdapter angefordert. Auch dies wird durch eine eigene
Klasse ersezt und funktioniert.
5. Von der IDXGIAdapter-Klasse wird auch per "GetParent" ein IDXGIFactory angefordert (ganz wichtig, da hiermit die
SwapChain angelegt wird!) und hier passiert es. Die eigene Klasse wird, wieso auch immer, nicht als Rückgabe
akzeptiert?!
Delphi-Quellcode:
function myIDXGIAdapter.GetParent(const IID: TGUID;out pParent): HResult; stdcall;
var
hr : HRESULT;
pmyIDXGIFactory : IDXGIFactory;
ppmyIDXGIFactory : IDXGIFactory;
begin
if (GUIDToString(IID) = IDXGIFactoryStr) then begin
hr := m_pIDXGIAdapter.GetParent(IID,pmyIDXGIFactory);
ppmyIDXGIFactory := myIDXGIFactory.create(pmyIDXGIFactory);
Pointer(pParent) := Pointer(ppmyIDXGIFactory);
///////////////////////////////////////////////////////
// Diese Rüchgabe ohne die Klasse funktioniert !!! ////
// Pointer(pParent) := Pointer(pmyIDXGIFactory); //////
///////////////////////////////////////////////////////
result := hr;
end else begin
result := m_pIDXGIAdapter.GetParent(IID,pParent);
end;
end;
Wie im Quelltext zu sehen bzw. vermerkt funktioniert es nur wenn ich die Variable von der originalen
DLL
zurück gebe.
Hat jemand eine Lösung dafür bzw. sich schon mal mit diesem "Problem" auseinander gesetzt?
Bin für jede Hilfe, jeden Tip dankbar.
CU GOOFY