Hurraaaaa!
Das mit dem Memory Manager hat mein erstes Problem gelöst.
Ich mache das jetzt so:
FreeBASIC-Code:
Code:
' gets pointer to Delphi's memory manager
Function GetMemoryManager() As TMemoryManager Ptr
#Define UNKNOWN &hCC
Dim pattern(...) As UByte = {&h53, &h85, &hC0, &h7E, &h15, &hFF, &h15, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, _
&h8B, &hD8, &h85, &hDB, &h75, &h0B, &hB0, &h01, &hE8, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, &hEB, &h02, _
&h33, &hDB, &h8B, &hC3, &h5B, &hC3}
Dim j As Integer = 0
For i As UByte Ptr = &h401000 To &h40F000 Step 1
If pattern(j) = UNKNOWN OrElse *i = pattern(j) Then
j += 1
If j > UBound(pattern) Then Return *CPtr(TMemoryManager Ptr Ptr, i - UBound(pattern) + 7)
Else
j = 0
EndIf
Next
Return NULL
End Function
So kriege ich den Memory Manager der EXE.
In der
DLL hab ich jetzt diese Funktion, die ich dann aufrufe: Ultimate_SetMemoryManager(GetMemoryManager())
Delphi-Quellcode:
function Ultimate_SetMemoryManager(memmgr: PMemoryManager): Boolean; stdcall;
begin
Result := false;
SetMemoryManager(memmgr^);
Result := true;
end;
Übrigens: mich wundert, warum es ShareMem und sonstwelche Units dafür gibt, wenn es reichen würde, dass die
DLL eine SetDLLMemoryManager-Funktion exportiert und man in der EXE dann einfach SetDLLMemoryManager(GetMemoryManager()) macht.
Danke Leute!
Problem 1 ist somit endlich gelöst!
Jetzt bleiben allerdings noch
Problem 2 und 3!
mfG Cherry