Einzelnen Beitrag anzeigen

Benutzerbild von Sanchez
Sanchez

Registriert seit: 24. Apr 2003
Ort: Neumarkt Stmk
892 Beiträge
 
Delphi XE6 Enterprise
 
#7

Re: Strukturen von C++ nach C# übersetzen

  Alt 17. Feb 2005, 11:04
Nein, leider nicht.
Das läuft im CompactFramework, dort gibts kein MarshalAs. Ich glaube ich muss alles zu Fuß erledigen.

Deshalb hab ich mir jetzt ne Basisklasse geschrieben:
Code:
   public abstract class StructMarshalBase
   {
      protected byte[] m_data = null;
      /// <summary>
      /// In Byte
      /// </summary>
      public const int RAS_MaxEntryName = 42;
      public StructMarshalBase()
      {
         m_data = new byte[GetSize()];
      }
      public abstract int GetSize();
      public IntPtr ToIntPtr()
      {
         IntPtr Pointer = new IntPtr();
         Pointer = MarshalEx.AllocHLocal(GetSize());
         Marshal.Copy(m_data, 0, Pointer, GetSize());
         return Pointer;
      }
      public void LoadFromIntPtr(IntPtr _pointer)
      {
         Marshal.Copy(_pointer, m_data, 0, GetSize());
      }
   }
und davon leite ich mir jetzt meine Struct-Entsprechungen ab, die das Bytearray interpretieren, bzw. reinschreiben. z.B.
Code:
   public class RASCONN : StructMarshalBase
   {
      //int dwSize;
      //IntPtr hRasCon;
      //char[RAS_MaxEntryName + 1] szEntryName;
      public Int32 dwSize
      {
         get
         {
            return BitConverter.ToInt32(m_data, 0);
         }   
         set
         {
            Buffer.BlockCopy(BitConverter.GetBytes(value), 0,
               m_data, 0, BitConverter.GetBytes(value).Length);
         }
      }
      public IntPtr hRasCon
      {
         get {return new IntPtr (BitConverter.ToInt32(m_data, 4));}
         set
         {
            Buffer.BlockCopy(BitConverter.GetBytes(value.ToInt32()),
               0, m_data, 4, BitConverter.GetBytes(value.ToInt32()).Length);
         }
      }
      public string szEntryName
      {
         get
         {
            byte[] Text = new byte[RAS_MaxEntryName];
            Array.Copy(m_data, 8, Text, 0, Text.Length);
            return xtox.byteArrayToString(Text);
         }
         set
         {
            if (value.Length <= RAS_MaxEntryName)
            {
               Buffer.BlockCopy(xtox.stringToByteArray(value),
                  0, m_data, 8, value.Length);
            }
            else
            {
               throw new Exception("szEntryName darf nicht größer als " + RAS_MaxEntryName.ToString() + " sein!");
            }
         }
      }
      public override int GetSize()
      {
         return 8 + RAS_MaxEntryName;
      }
   }
Nur ist dort leider noch ein Fehler drinnen. Die API-Funktion "RasEnumConnections" liefert jetzt den Fehler ERROR_INVALID_SIZE. Vorher gabs ne Erfolgsmeldung, nur die Strings wurden nicht "ge-marshallt".
Daniel
Testen ist feige!
  Mit Zitat antworten Zitat