ObjectCast in einer BlitzMax App mit einer BlitzMax DLL
Übersicht

![]() |
kogBetreff: ObjectCast in einer BlitzMax App mit einer BlitzMax DLL |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich Probiere schon seit Tagen an dem teil rum ...
cast.cpp Code: [AUSKLAPPEN] #include <windows.h>
#include <brl.mod/blitz.mod/blitz_types.h> extern "C" { void *Pointer(BBObject *o); BBObject *Cast(void *p); } void *Pointer(BBObject *o) { return o; } BBObject *Cast(void *p) { return (BBObject*)p; } test.bmx Code: [AUSKLAPPEN] SuperStrict
Framework pub.stdc Import brl.retro Import brl.linkedlist Import "cast.cpp" Extern "C" Function Pointer:Byte Ptr(o:Object) Function Cast:Object(p:Byte Ptr) End Extern Global list:TList=CreateList() Type Test Field a:Int=1337 Field b:Int=1338 Field c:Int=1339 Field k:Float=1400.1 End Type Global a:test=New test list.addlast(a) list.addlast(a) list.addlast(a) list.addlast(a) Print Hex(Int(Varptr(list))) Local list2:TList=TList(cast(Byte Ptr(Int Ptr(Varptr(list))[0]))) 'Ja es geht auch nur Byte Ptr List, ich weiss If list2 Print list2.count() Repeat Delay 10 Forever DLL Code: [AUSKLAPPEN] SuperStrict
Framework kogn.dll Import brl.retro Import brl.linkedlist Import "cast.cpp" Extern "C" Function Pointer:Byte Ptr(o:Object) Function Cast:Object(p:Byte Ptr) End Extern Type Test Field a:Int Field b:Int Field c:Int Field k:Float End Type Function DllMain:Int(hInstance:Int,dwReason:Int, lpReserved:Byte Ptr) Select dwReason Case DLL_PROCESS_ATTACH Local addr:Byte Ptr=Byte Ptr(Int Ptr($00413A74)[0]) Local list:TList=TList(cast(addr)) If list Notify "ok" End Select Return True End Function In der Application direktes Casten klappt 1A.... doch sobald ich die DLL Injecte und in der DLL versuche es zu Casten funktioniert es nicht, obwohl ich die Richtige Adresse angebe, mit MemCopy würde es auch ohne Probleme gehen, ist aber nicht mein Ziel, sondern es anders zu lösen. Theoretisch sollte es ja gehen, da ich ja im Internen Speicher bin... Bin Ratlos, erbitte um hilfe ![]() |
||
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die addresse ist nicht beim GC registriert, das Reference-Counting wird dir sammt GC und BMax um die ohren fliegen. | ||
![]() |
kog |
![]() Antworten mit Zitat ![]() |
---|---|---|
Irgend ne möglichkeit dies zu umgehen? | ||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nicht BM benutzen.
In BM ist entweder alles sauber eine Referenz (oder dem GC bekannt) oder es ist garnichts. In letzterem Falle ist das einzige was du machen kannst, deine Klasse um eine SerializeFromMemory Methode zu erweitern, welche es dir erlaubt ein Objekt aus einem Memory Block befüllen zu lassen. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group