AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi D3D9 Hook bzw. als "proxy.dll"
Thema durchsuchen
Ansicht
Themen-Optionen

D3D9 Hook bzw. als "proxy.dll"

Ein Thema von GOOFY009 · begonnen am 24. Okt 2009 · letzter Beitrag vom 21. Nov 2009
Antwort Antwort
Seite 3 von 3     123   
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#21

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

  Alt 27. Okt 2009, 22:22
Ich glaube nicht. Wird aber nicht funktionieren, weil, wie Remko und ich festgestellt haben, Delphi da etwas anderes draus bastelt.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Remko
Remko

Registriert seit: 10. Okt 2006
Ort: 's-Hertogenbosch, Die Niederlande
222 Beiträge
 
RAD-Studio 2010 Arc
 
#22

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

  Alt 27. Okt 2009, 23:00
The only workaround I see is by declaring result as pointer...
See my blog blog
See our Jedi blog
  Mit Zitat antworten Zitat
GOOFY009

Registriert seit: 24. Okt 2009
20 Beiträge
 
#23

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

  Alt 28. Okt 2009, 12:28
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
Angehängte Dateien
Dateityp: rar d3d9_135.rar (911,8 KB, 25x aufgerufen)
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#24

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

  Alt 28. Okt 2009, 18:44
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
GOOFY009

Registriert seit: 24. Okt 2009
20 Beiträge
 
#25

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

  Alt 28. Okt 2009, 20:25
Hi !
Unglaublich aber wahr....
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
  Mit Zitat antworten Zitat
Benutzerbild von Remko
Remko

Registriert seit: 10. Okt 2006
Ort: 's-Hertogenbosch, Die Niederlande
222 Beiträge
 
RAD-Studio 2010 Arc
 
#26

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

  Alt 28. Okt 2009, 20:30
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;
See my blog blog
See our Jedi blog
  Mit Zitat antworten Zitat
Benutzerbild von TKC
TKC

Registriert seit: 21. Apr 2004
Ort: Tuningen
367 Beiträge
 
Delphi XE2 Enterprise
 
#27

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

  Alt 20. Nov 2009, 10:02
Zitat von GOOFY009:
Hi !
Unglaublich aber wahr....
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.
  Mit Zitat antworten Zitat
GOOFY009

Registriert seit: 24. Okt 2009
20 Beiträge
 
#28

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

  Alt 21. Nov 2009, 22:03
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


CU

GOOFY
Angehängte Dateien
Dateityp: rar d3d9dll_836.rar (6,7 KB, 45x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:02 Uhr.
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