你到底问delphi的问题,还是问C#的问题

解决方案 »

  1.   

    不好意思,delphi的这个函数在C#下如何处理那个数组指针,谢谢
      

  2.   

    我是这么调用,不行,麻烦帮看下哪里的问题,对C#不熟
    [DllImport("TradeOnline", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
            public static extern bool LaunchOnline(IntPtr[] POnlineClock)int num = listView2.Items.Count
    TOnlineClock[] pclks = new TOnlineClock[num];
    IntPtr[] pBuf = new IntPtr[1];
    pBuf[0] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(TOnlineClock)) * num); //分配包含两个元素的数组  
    for (int i = 0; i < num; i++)
    {
       pclks[i] = new TOnlineClock();
       pclks[i].Clock_id = int.Parse(listView2.Items[i].Text);
       pclks[i].IPAddr = listView2.Items[i].SubItems[1].Text;
       pclks[i].Port = int.Parse(listView2.Items[i].SubItems[2].Text);
       Marshal.StructureToPtr(pclks[i], pBuf[i], true);                     
    }                if (EastRiver_API.LaunchOnline(pBuf))
      

  3.   

    IntPtr[] 这是啥?
    要么定义个数组来接,要么定义个指针来接
    你定义个指针数组是想干啥?
      

  4.   

    array of POnlineClock到底是个什么类型的数组?
    你需要在C#里找到对应类型的数组来与它对应
      

  5.   

    不要用IntPtr[]····
    直接使用一个指针就足够了··
    IntPtr····就够了····
      

  6.   

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
            public struct TOnlineClock
            {
                public Int32 Clock_id;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
                public string IPAddr;
                public Int32 Port;
                public Byte Connected;
                public Int32 kModel;
                public Double LastHeartTime;
            }  
    [DllImport("TradeOnline", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
            public static extern bool LaunchOnline(IntPtr POnlineClock);这个函数作用就是传一个设备的指针数组给delphi写的dll
    调用代码,测试通不过
    int num = listView2.Items.Count; //设备个数
                     TOnlineClock[] pclks = new TOnlineClock[num];
                     int size = Marshal.SizeOf(typeof(TOnlineClock)) * num;
                     IntPtr pBuf = Marshal.AllocHGlobal(size);
                     long ptr = pBuf.ToInt64();
                     for (int i = 0; i < num; i++)
                     {
                         IntPtr RPtr = new IntPtr(ptr);                     
                         pclks[i] = new EastRiver_API.TOnlineClock();
                         pclks[i].Clock_id = int.Parse(listView2.Items[i].Text);
                         pclks[i].IPAddr = listView2.Items[i].SubItems[1].Text;
                         pclks[i].Port = int.Parse(listView2.Items[i].SubItems[2].Text);
                         Marshal.StructureToPtr(pclks[i], RPtr, false);
                         ptr += Marshal.SizeOf(typeof(TOnlineClock));                     
                     }                                 if (LaunchOnline(pBuf))
      

  7.   

    看不懂你的代码都在干啥
    定义了个pBuf,循环里根本没用到啊
    从定义开始,这个pBuf就没变过,你循环完把它传递给dll,有用?
      

  8.   

    pBuf有变的,你可以自己测试下,还原出来是对的,不过不清楚为什么穿给delphi后那个参数的数组变得很大,本来是一个设备,到了动态库那边就变成了几千个数组
      

  9.   


     Marshal.StructureToPtr(pclks[i], RPtr, false); 把数组循环写到以pBuf为首地址的非托管内存里了
    把导入的函数声明改一下试试
    [DllImport("TradeOnline", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
    public static extern bool LaunchOnline(
              [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1, ArraySubType=UnmanagedType.LPStruct)] IntPtr POnlineClock)
      

  10.   

    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1, ArraySubType=UnmanagedType.LPStruct)] TOnlineClock[] POnlineClock)
      

  11.   

    不过看MS的例子上,并没有指定ArraySubType,你可以去掉试试
    http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshalasattribute.sizeparamindex.aspx
      

  12.   

    这样试了还是不行,把ArraySubType 去掉也不行,申明里是要指明SizeParamIndex 的位置,但是函数里又没有这个参数[DllImport("TradeOnline", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
            public static extern bool LaunchOnline([MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1, ArraySubType = UnmanagedType.LPStruct)] TOnlineClock[] POnlineClock);int num = listView2.Items.Count;                 
                     EastRiver_API.TOnlineClock[] pclks = new EastRiver_API.TOnlineClock[num];
                     for (int i = 0; i < num; i++)
                     {                    
                         pclks[i] = new EastRiver_API.TOnlineClock();
                         pclks[i].Clock_id = int.Parse(listView2.Items[i].Text);
                         pclks[i].IPAddr = listView2.Items[i].SubItems[1].Text;
                         pclks[i].Port = int.Parse(listView2.Items[i].SubItems[2].Text);                    
                     }
    if (EastRiver_API.LaunchOnline(pclks)