![]() |
Re: D3D9 Hook bzw. als "proxy.dll"
Ich glaube nicht. :mrgreen: Wird aber nicht funktionieren, weil, wie Remko und ich festgestellt haben, Delphi da etwas anderes draus bastelt.
|
Re: D3D9 Hook bzw. als "proxy.dll"
The only workaround I see is by declaring result as pointer...
|
Re: D3D9 Hook bzw. als "proxy.dll"
Liste der Anhänge anzeigen (Anzahl: 1)
WOW,
hätte ja nicht gedacht, dass mein "kleines" Problem zu einem doch etwas "größerem" Entwickelt. Ich habe dem Post mal meine momentanen Sourcen inkl. DirectX Headern und dem Testprogramm CreateDevice angehängt. Vieleicht kann sich das ja mal jemand anschauen und findet vieleicht so den Fehler bzw. eine Lösung des Problems. Beim Rückgabewert habe ich bisher mehrere Varianten probiert... die letzten 2 schienen mir am ehesten "Funktional" zu sein, brachten aber leider keinen Erfolg. 1. Variante :
Delphi-Quellcode:
2. Variante :
function Direct3DCreate9(SDKVersion: cardinal): IDirect3D9; stdcall;
..... function Direct3DCreate9(SDKVersion: LongWord): IDirect3D9; begin if gl_hOriginalDll = 0 then LoadOriginalDLL; @Direct3DCreate9original := GetProcAddress(gl_hOriginalDll, 'Direct3DCreate9'); pmyIDirect3D9 := myIDirect3D9.Create; pmyIDirect3D9.myIDirect3D9(IDirect3D9(Direct3DCreate9original(SDKVersion))); pmyIDirect3D9._AddRef; result := pmyIDirect3D9 as IDirect3D9; end;
Delphi-Quellcode:
Beides wird vom Aufrufenden Programm (CreateDevice) mit "Runtime error 216 at xxxx" quittiert.
function Direct3DCreate9(SDKVersion: cardinal): Pointer; stdcall;
..... function Direct3DCreate9(SDKVersion: LongWord): Pointer; begin if gl_hOriginalDll = 0 then LoadOriginalDLL; @Direct3DCreate9original := GetProcAddress(gl_hOriginalDll, 'Direct3DCreate9'); pmyIDirect3D9 := myIDirect3D9.Create; pmyIDirect3D9.myIDirect3D9(IDirect3D9(Direct3DCreate9original(SDKVersion))); pmyIDirect3D9._AddRef; result := pmyIDirect3D9; end; Ein eigenes Interface zu schreiben, welches von IDirect3D9 abstammt, bringt ja nix weil ich ja die DirectX-Funktionen vom aufrufenden Programm abfangen, in meiner DLL verarbeiten und dann an die originale d3d9.dll weitergeben möchte. Ergo brauche ich ja eine eigene Klasse. Wäre schon übel wenn das ganze scheitert, nur weil der Compiler von Delphi hier einen "Fehler" macht......(wenn ich die anderen Posts richtig verstanden habe). Ich werd mal auf jeden Fall weiter im Netzt suchen und das eine oder andere dann vieleicht Probieren. Die Hoffnung stirbt bekanntlich ja zu letzt...... CU GOOFY |
Re: D3D9 Hook bzw. als "proxy.dll"
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.
|
Re: D3D9 Hook bzw. als "proxy.dll"
Hi !
Unglaublich aber wahr.... Zitat:
funktioniert das Ganze jetzt !!! SUPER !!! Danke !!! Irgendwie hatte ich mich bei pmyIDirect3D9 total auf die Klasse "versteift". Jetzt kann ich mich daran machen die myIDirect3DDevice9 Klasse zu schreiben um dann letztlich vollen Zugriff auf DirectX im aufrufenden Programm zu haben um dort meine Ausgaben zu platzieren. Für mich ist dieser Topic ertsmal gelöst. Sollte Interesse an der weitern Entwicklung vorhanden sein, so würde ich natürlich weiterhin meine Ergebnisse hier zur Verfügung stellen. Danke nochmal an alle die geholfen haben. Vieleicht (hoffentlich nicht ;-) ) muss ich ja doch nochmal wegen eines Problems "vorbei kommen". CU GOOFY |
Re: D3D9 Hook bzw. als "proxy.dll"
Just a tip: if you want to define a function where you are not going to modify the results or when you do not know the number of parameters or the type (or are just too lazy too declare them all ;-) you can declare it like this:
Delphi-Quellcode:
var
FunctionPtr: Pointer; GetProcedureAddress(FunctionPtr, 'my.dll', 'SomeExternalFunction'); procedure SomeExternalFunction; asm jmp dword ptr FunctionPtr; end; exports SomeExternalFunction; |
Re: D3D9 Hook bzw. als "proxy.dll"
Zitat:
wärst du so nett den geänderten Quelltext nochmal bereitzustellen ? Ich fand es bis jetzt ziemlich lehrreich für mich. |
Re: D3D9 Hook bzw. als "proxy.dll"
Liste der Anhänge anzeigen (Anzahl: 1)
Hi !
Kein Problem, mach ich gerne. Hab die Dateien mal angehängt und sollten so funktionieren. Da mein Projekt mittlerweile um einiges "gewachsen" ist habe ich mal nur die die Dateien reingepackt, welche für dich Interessant sein dürften. Kann sein das Du da vieleicht das eine oder andere (event. für dich unnötige Variablen etc) löschen musst aber der Quelltext sollte dich zu einer funktionierenden d3d9.dll führen. Es gibt auch noch eine funktionierende Swapchain die wohl einige Programme (die auf DX9 aufbauen) benötigen um seinen eigenen Anzeigen im fremden Programm anzuzeigen benötigen. Sollte die noch gebraucht werden, einfach noch mal melden. Ich brauche diese für mein Projekt letztlich doch nicht. Habe ich aber erst festgestellt nach dem ich das Teil fertig hatte :lol: CU GOOFY |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz