ObjectCast in einer BlitzMax App mit einer BlitzMax DLL

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

kog

Betreff: ObjectCast in einer BlitzMax App mit einer BlitzMax DLL

BeitragSa, Apr 18, 2009 22:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Sad

BtbN

BeitragSa, Apr 18, 2009 23:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Die addresse ist nicht beim GC registriert, das Reference-Counting wird dir sammt GC und BMax um die ohren fliegen.

kog

BeitragSo, Apr 19, 2009 0:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Irgend ne möglichkeit dies zu umgehen?
 

Dreamora

BeitragSo, Apr 19, 2009 3:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group