none
неуправляемая dll возвращает структуру RRS feed

  • Общие обсуждения

  • Привет всем! Есть неуправляемая dll написаная на C без исходного кода,которую нужно подключить к C# проекту.

    Все хорошо, но функции, которые мне нужны возвращают структуры, не указатель, а именно структуру.
    Перечитал и попробовал много всего, но так и не смог подключить. Помогите!

    Вот то что я сделал на C#

    class Trade
    {

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct Order
    {
    public int Id;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 15)]
    public string ShortName;
    public int OrderId;
    public int OrderNum;
    public byte Type;
    public byte Direction;
    public double Price;
    public int Quantity;
    public double Volume;
    public int Date;
    public int Time;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 15)]
    public string TrdAcc;
    public int ClntAcc;
    public int Status;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 15)]
    public string Firm;
    public byte Currency;
    public double ClosePrice;
    public int CloseDate;
    public int KredId;
    public int KredCnt;
    }


    [DllImport("trade.dll")]
    public static extern int getOrderCount();

    /*
    * Получение информации о заявке по номеру в списке
    struct Order getOrderByNum(long):
    – возвращает информацию о заявке (структура "Order")
    по порядковому номеру от "0" до "N-1" (где N=getOrderCount()).

    */
    //extern "C" __stdcall __declspec( dllimport ) Order getOrderByNum(long num);
    [DllImport("trade.dll", EntryPoint = "DllEntryPoint", CallingConvention = CallingConvention.StdCall,CharSet = CharSet.Ansi)]
    public static extern void getOrderByNum([Out] out Order order, int num);


    public static int OrderCount()
    {
    return getOrderCount();
    }

    public static string OrderName()
    {


    Order no = new Order();
    var len = getOrderCount();
    int zzz = Marshal.SizeOf(typeof(Order));

    getOrderByNum(out no, i);



    return no.OrderId.ToString();


    }
    }


    Вот код на C


    struct Order {
    long Id;
    char ShortName[15];
    long OrderId;
    long OrderNum;
    char Type;
    char Direction;
    double Price;
    long Quantity;
    double Volume;
    long Date;
    long TIme;
    char TrdAcc[15];
    long ClntAcc;
    long Status;
    char Firm[15];
    char Currency;
    double ClosePrice;
    long CloseDate ;
    long KredId;
    long KredCnt;
    };

    extern "C" __stdcall __declspec ( dllimport ) long getOrderCount();
    extern "C" __stdcall __declspec ( dllimport ) Order getOrderByNum(long num);

    //---------------------------------------------------------------------------
    void __fastcall TForm3::BitBtn2Click(TObject *Sender)
    {


    long l =getOrderCount();
    String s = (String)l;
    ShowMessage(l);
    Order o =getOrderByNum(0);
    ShowMessage(o.ShortName);
    // все просто шикарно работает
    }
    //---------------------------------------------------------------------------
    • Изменен тип I.Vorontsov 28 декабря 2009 г. 5:22
    • Перемещено Siddharth Chavan 1 октября 2010 г. 22:40 MSDN Forums Consolidation (От:Visual C#)
    21 декабря 2009 г. 4:07

Все ответы

  • А почему в тех местах, где в определении структур на С идет тип long, при определении на C# вы используете int ?? Ведь размеры типов могу отличаться.
    Попробуйте такой код, если не будет работать - напишите ошибку, которую выдает

       [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
        public struct Order
        {
            public long Id;
    
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 15)]
            public string ShortName;
    
            public long OrderId;
            public long OrderNum;
            public char Type;
            public char Direction;
            public double Price;
            public long Quantity;
            public double Volume;
            public long Date;
            public long Time;
    
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 15)]
            public string TrdAcc;
            public long CIntAcc;
            public long Status;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 15)]
            public string Firm;
            public char Currency;
            public double ClosePrice;
            public long CloseDate;
            public long KredId;
            public long KredCnt;
        }
    
            [DllImport("trade.dll", EntryPoint = "DllEntryPoint")]
            public static extern Order GetOrderByNum(int num);
    21 декабря 2009 г. 8:55
  • Так это библиотека CBuilder'a там тип long= 4 байта, а в C# = 8 байт
    22 декабря 2009 г. 5:00
  • Ясно, в любом случае, хотелось бы видеть на что он ругается.
    22 декабря 2009 г. 7:53
  • Вот верный вариант решения. Во первых структура :

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
     public struct Order
             {
                 public int Id;
                 public unsafe fixed byte ShortName[15];
                 public int OrderId;
                 public int OrderNum;
                 public byte Type;
                 public byte Direction;
                 public double Price;
                 public int Quantity;
                 public double Volume;
                 public int Date;
                 public int Time;
                 public unsafe fixed byte TrdAcc[15];
                 public int ClntAcc;
                 public int Status;
                 public unsafe fixed byte Firm[15];
                 public byte Currency;
                 public double ClosePrice;
                 public int CloseDate;
                 public int KredId;
                 public int KredCnt;
             }

    объявление :
            [DllImport("trade.dll")]
            public static extern Order getOrderByNum( int num);

    вызов:
                Order no = new Order();
             
                no = getOrderByNum(0);
    5 января 2010 г. 7:04