Einzelnen Beitrag anzeigen

OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#2

Re: .NET Pointer auf Records

  Alt 23. Dez 2006, 17:33
Eine Möglichkeit, die ich mal irgendwo gesehen und selbst ausprobiert habe, ist die folgende (hier in C#).
Code:
protected object ReadStruct(NetworkStream stream, Type type)
{
    byte[] buffer = new byte[Marshal.SizeOf(type)];
    stream.Read(buffer, 0, Marshal.SizeOf(type));
    GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
    object value = Marshal.PtrToStructure(handle.AddrOfPinnedObject(), type);
    handle.Free();
    return value;
}

protected void WriteStruct(NetworkStream stream, Type type, object value)
{
    byte[] buffer = new byte[Marshal.SizeOf(type)];
    GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
    Marshal.StructureToPtr(value, handle.AddrOfPinnedObject(), false);
    stream.Write(buffer, 0, Marshal.SizeOf(type));
    handle.Free();
}
Ich bin ehrlich gesagt nicht sicher, ob diese Lösung gut ist, aber zumindest funktioniert sie. Wenn deine Struktur also zum Beispiel TerminalTransferData heißt, wäre der Aufruf in C# wie folgt:
Code:
WriteStruct(stream, typeof(TerminalTransferData), data);
Grundsätzlich müsste man auch einfach innerhalb der Funktion value.GetType() aufrufen können, um an den Type zu kommen.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat