Hallo Leute,
ich versuche gerade die Proxy.dll von Michael Koch (
Link ) nach Delphi zu portieren, da ich im Netzt nichts brauchbares in Delphi gefunden habe.
Leider sind meine Kentnisse in C++ eher "bescheiden" (eigentlich gegen NULL). Was mich aber nicht abhalten soll es dennoch irgendwie zu schaffen
.
Zu Beginn würde es mir schon einmal reichen, die Originalfunktion aus der im SystemDir liegenden d3d9.dll zu laden und an das aufrufende Programm zurück zu geben.
Das Laden der Function stellt dabei kein Problem da.... nur wenn ich die Funktion
oDirect3D9_Create := GetProcAddress(gl_hOriginalDll, 'Direct3DCreate9');
aufrufe (Rückgabe ist ein Pointer) und dann mit
Delphi-Quellcode:
ppIDirect3D9_orig := IDirect3D9(oDirect3D9_Create(SDKVersion));
result := ppIDirect3D9_orig;
zurück geben will, habe ich ein Problem.
ppIDirect3D9_orig wird mir als
Pointer(xxxxx) of IDirect3D9 angezeigt und damit kommt es zum Absturz des Programms/der
Dll.
Ich habe auch hier schon im Forum gesucht und habe dabei
diesen Beitrag gefunden, welcher mir aber nicht wirklich geholfen hat.
Wenn also jemmand eine Idee hätte oder vieleicht sogar vor dem gleichen Problem stand und mir helfen könnte
würde ich mich über entsprechene Hilfe/Tips sehr freuen.
Zum Abschluß noch der Code der
DLL :
Delphi-Quellcode:
library d3d9;
uses
Windows,
SysUtils,
Classes,
Direct3D9,
d3dx9,
my_IDirect3DDevice9 in 'my_IDirect3DDevice9.pas',
my_IDirect3D9 in 'my_IDirect3D9.pas',
tools in 'tools.pas',
global_var in 'global_var.pas';
type
TDirect3DCreate9 = function(SDKVersion: LongWord): Pointer; stdcall;
var
oDirect3D9_Create : TDirect3DCreate9 = nil;
ppIDirect3D9_orig : IDirect3D9;
{$R *.res}
function Direct3DCreate9(SDKVersion: LongWord): IDirect3D9;
begin
if gl_hOriginalDll = 0 then LoadOriginalDLL;
oDirect3D9_Create := GetProcAddress(gl_hOriginalDll, 'Direct3DCreate9');
ppIDirect3D9_orig := IDirect3D9(oDirect3D9_Create(SDKVersion));
result := ppIDirect3D9_orig;
end;
procedure InitInstance;
begin
gl_hOriginalDll := 0;
end;
procedure ExitInstance;
begin
if gl_hOriginalDll <> 0 then begin
FreeLibrary(gl_hOriginalDll);
gl_hOriginalDll := 0;
end;
end;
procedure DLLEntryPoint(reason : Integer);
begin
case reason of
DLL_PROCESS_DETACH :
begin
ExitInstance;
end;
DLL_PROCESS_ATTACH :
begin
InitInstance;
end;
DLL_THREAD_DETACH : exit;
DLL_THREAD_ATTACH : exit;
end;
end;
exports
Direct3DCreate9;
begin
DLLProc := @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
Bei der ersten Quelle gibt es auch den Quellcode in C++ wenn benötigt.
CU
GOOFY