Конференция ".Net" » Конвертация Win32 в .NET [D8, D2005, WinXP]
 
  • Mike Petrichenko (21.07.06 16:28) [0]
    Доброго времени суток!

    Господа, имеется вот такая чудная структура, подскажите, как конвертнуть в .NET. Особенно в части CASE.

    TirdaAttribOctetSeq = record
       Len: u_short;
       OctetSeq: array [0..IAS_MAX_OCTET_STRING - 1] of u_char;
     end;

     TirdaAttribUsrStr = record
       Len: u_char;
       CharSet: u_char;
       UsrStr: array [0..IAS_MAX_USER_STRING - 1] of u_char;
     end;

     IAS_SET = record
       irdaClassName: array [0..IAS_MAX_CLASSNAME - 1] of Char;
       irdaAttribName: array [0..IAS_MAX_ATTRIBNAME - 1] of Char;
       irdaAttribType: u_long;
       irdaAttribute: record
                        case Byte of
                          0: (irdaAttribInt: Long);
                          1: (irdaAttribOctetSeq: TirdaAttribOctetSeq);
                          2: (irdaAttribUsrStr: TirdaAttribUsrStr);
                      end;
     end;
  • saxon (21.07.06 17:04) [1]
    Напрямую даже и не знаю.
    А вот если из файла читать, так наверное Reader свой делать.
    Может поможет.
  • saxon (21.07.06 17:13) [2]
    хотя наверное как то так
    struct aa1
       {
           private byte aaa;
           public byte aa
           {
               get
               {
                   switch (aaa)
                   {
                       case 1:
                           {
                               return 1;
                           }
                       case 0:
                           {
                               return 2;
                           }
                   }
                   return 0;
               }
               set
               {
                   ...
               }
           }
       }
  • Mike Petrichenko (21.07.06 17:15) [3]

    > А вот если из файла читать, так наверное Reader свой делать.

    Эта структура передается в функцию SetSockOpt. :)
    Т. е. ее потом еще и хитро запонять нужно. римерно вот так
    IASSetLen := SizeOf(IASSetBuff);
         FillChar(IASSetBuff, IASSetLen, 0);
         pIASSet := PIAS_SET(@IASSetBuff);

         with pIASSet^ do begin
           StrLCopy(irdaClassName, PChar(FIrDATransport.FService), Length(FIrDATransport.FService));
           irdaAttribName := 'BABA:BABABA';
           irdaAttribType := IAS_ATTRIB_STR;
           irdaAttribute.irdaAttribUsrStr.Len := 12
         end;
  • Mike Petrichenko (21.07.06 17:17) [4]
    И вообще, на сколько приспособлена .NET для работы , ну скажем, с сокетами на низком уровне?
    P.S. Я его родственник, этого NET с M$ вместе взятыми
  • saxon (21.07.06 17:36) [5]

    > И вообще, на сколько приспособлена .NET для работы , ну
    > скажем, с сокетами на низком уровне?


    С сокетами не работал, но думаю тут не должно быть проблемм.
    Там много всяких классов и всякого другого для работы с сокетами.
    Все, как всегда, зависит от задачи.
  • DiamondShark © (21.07.06 22:02) [6]
    StructLayout(LayoutKind.Explicit) поможет в части case

    где-то примерно так:

    [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
    public struct TirdaAttribOctetSeq
    {
    public UInt16 Len;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst=111)]
    public string OctetSeq;
    }


    [StructLayout(LayoutKind.Explicit, CharSet=CharSet.Ansi)]
    public struct _irdaAttribute
    {
    [FieldOffset(0)]
    public long irdaAttribInt;
    [FieldOffset(0)]
    public TirdaAttribOctetSeq irdaAttribOctetSeq;
    }


    [StructLayout(LayoutKind.Explicit, CharSet=CharSet.Ansi)]
    public struct IAS_SET
    {
    [FieldOffset(0)]
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst=123)]
    public string irdaClassName;
    [FieldOffset(123)]
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst=321)]
    public string irdaAttribName;
    [FieldOffset(444)]
    public UInt32 irdaAttribType;
    }




    лень всё переводить, но принцип ясен.
    вместо цифирей SizeConst=ХХХ должны стоять реальные длины массивов.
    А смещения полей для атрибутов FieldOffset придётся посчитать на пальцах.

    Перед использованием обязательно проверить размеры вызовом
    Marshal.SizeOf
  • DiamondShark © (21.07.06 22:07) [7]
    самое важное забыл ;)))

    [StructLayout(LayoutKind.Explicit, CharSet=CharSet.Ansi)]
    public struct IAS_SET
    {
     [FieldOffset(0)]
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst=123)]
     public string irdaClassName;
     [FieldOffset(123)]
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst=321)]
     public string irdaAttribName;
     [FieldOffset(444)]
     public UInt32 irdaAttribType;
     [FieldOffset(448)]
     public _irdaAttribute irdaAttribute; // это вместо вариантной части
    }
 
Конференция ".Net" » Конвертация Win32 в .NET [D8, D2005, WinXP]
Есть новые Нет новых   [134430   +2][b:0][p:0.001]