Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi D3D9 Hook bzw. als "proxy.dll" (https://www.delphipraxis.net/142249-d3d9-hook-bzw-als-proxy-dll.html)

Apollonius 27. Okt 2009 21:22

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.

Remko 27. Okt 2009 22:00

Re: D3D9 Hook bzw. als "proxy.dll"
 
The only workaround I see is by declaring result as pointer...

GOOFY009 28. Okt 2009 11:28

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:
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;
2. Variante :
Delphi-Quellcode:
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;
Beides wird vom Aufrufenden Programm (CreateDevice) mit "Runtime error 216 at xxxx" quittiert.

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

Apollonius 28. Okt 2009 17:44

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.

GOOFY009 28. Okt 2009 19:25

Re: D3D9 Hook bzw. als "proxy.dll"
 
Hi !
Unglaublich aber wahr....
Zitat:

Zitat von Apollonius
Die Variable pmyIDirect3D9 muss den Typen IDirect3D9 haben!

Nach dem ich das angepasst hate und die Create Funktion der Klasse zwecks Übergabe des Ursprungsparameters erweitert hatte
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

Remko 28. Okt 2009 19:30

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;

TKC 20. Nov 2009 09:02

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

Zitat von GOOFY009
Hi !
Unglaublich aber wahr....
Zitat:

Zitat von Apollonius
Die Variable pmyIDirect3D9 muss den Typen IDirect3D9 haben!

Nach dem ich das angepasst hate und die Create Funktion der Klasse zwecks Übergabe des Ursprungsparameters erweitert hatte
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

Hi,
wärst du so nett den geänderten Quelltext nochmal bereitzustellen ?
Ich fand es bis jetzt ziemlich lehrreich für mich.

GOOFY009 21. Nov 2009 21:03

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 22:15 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz